2015-07-01 3 views
0

Я хочу выполнить одно действие, если пользователь сделал одно касание, а другой, если пользователь сделал двойной контакт с ячейкой UITableView.Проблема при обнаружении двойного нажатия на UITableViewCell

Я пробовал несколько подходов, упомянутых в этом вопросе.

How can I detect a double tap on a certain cell in UITableView?

Но каждый подход, я не могу отличить одного крана и правильно удваивать. Я имел в виду, что в каждом двойном касании это случается и одним нажатием. Таким образом, происходит двойное нажатие, каждый раз, когда срабатывает однократное нажатие.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
FeedCell *myCell = (FeedCell*) [self.tblView cellForRowAtIndexPath:indexPath]; 

NSLog(@"clicks:%d", myCell.numberOfClicks); 

if (myCell.numberOfClicks == 2) { 
    NSLog(@"Double clicked"); 
} 
else{ 

    NSLog(@"Single tap"); 
} 
} 

Каким должен быть правильный способ?

+0

Использовать длинный жест прессы – vijeesh

+0

Где увеличить значение numberOfClicks? Где вы берете двойной кран? – YogevSitton

+0

в CustomTableViewCell – sajaz

ответ

2

Я бы предпочел не использовать didSelectRowAtIndexPath, пока вы хотите double tap действий. single TapGesture, которые заменяют didSelectRowAtIndexPath. любой код, который вы написали в didSelectRowAtIndexPath, который будет писать в методе выбора single tap.

Пример: Выполнение одиночного и двойного жестов, как показано ниже.

UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)] autorelease]; 
singleTap.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTap]; 

UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)] autorelease]; 
doubleTap.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTap]; 

[singleTap requireGestureRecognizerToFail:doubleTap]; 
+1

Простой метод. Работает на меня. Спасибо – sajaz

+0

@sajaz, спасибо за оценку. –

+0

Он даже работает на MapView без дополнительной сложности, такой как таймеры, дополнительные глобальные переменные и так далее ... – AndaluZ

0

В соответствии с ответом - ваш единственный кран будет обрабатывать метод срабатывания таймера. Положите одно действие крана здесь

- (void)tapTimerFired:(NSTimer *)aTimer{ 
    //timer fired, there was a single tap on indexPath.row = tappedRow 
    if(tapTimer != nil){ 
     tapCount = 0; 
     tappedRow = -1; 
    } 
} 

и двойное нажатие будет обрабатывать в didSelectRowAtIndexPath точно так, как показано:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    //checking for double taps here 
    if(tapCount == 1 && tapTimer != nil && tappedRow == indexPath.row){ 
     //double tap - Put your double tap code here 
     [tapTimer invalidate]; 
     [self setTapTimer:nil]; 
    } 
    else if(tapCount == 0){ 
     //This is the first tap. If there is no tap till tapTimer is fired, it is a single tap 
     tapCount = tapCount + 1; 
     tappedRow = indexPath.row; 
     [self setTapTimer:[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(tapTimerFired:) userInfo:nil repeats:NO]]; 
    } 
    else if(tappedRow != indexPath.row){ 
     //tap on new row 
     tapCount = 0; 
     if(tapTimer != nil){ 
      [tapTimer invalidate]; 
      [self setTapTimer:nil]; 
     } 
    } 
} 

Вам просто нужно объявить два свойства

@property (nonatomic, assign) NSInteger tapCount; 
@property(nonatomic, assign) NSInteger tappedRow; 

Это полностью рабочий фрагмент.

 Смежные вопросы

  • Нет связанных вопросов^_^