UIGestureRecognizer и UITableViewCell проблема - PullRequest
43 голосов
/ 05 января 2011

Я присоединяю UISwipeGestureRecognizer к UITableViewCell в методе cellForRowAtIndexPath: следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
        gesture.direction = UISwipeGestureRecognizerDirectionRight;
        [cell.contentView addGestureRecognizer:gesture];
        [gesture release];
    }
    return cell;
}

Однако метод didSwipe всегда вызывается дважды при успешном пролистывании. Сначала я думал, что это потому, что жест начинается и заканчивается, но если я выйду из системы самого gestRecognizer, они оба будут в состоянии «Завершено»:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"did swipe called %@", gestureRecognizer);
}

Консоль

2011-01-05 12:57:43.478 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right>
2011-01-05 12:57:43.480 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right>

Я действительно не знаю почему. Я явно пытался проверить состояние «Закончено», но это не помогает, так как они оба приходят как «Законченные» в любом случае ... Есть идеи?

Ответы [ 4 ]

109 голосов
/ 05 января 2011

Вместо добавления распознавателя жестов непосредственно в ячейку, вы можете добавить его в табличное представление в viewDidLoad.

В методе didSwipe вы можете определить затронутый IndexPath и ячейку следующим образом:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {

  if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        CGPoint swipeLocation = [gestureRecognizer locationInView:self.tableView];
        NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];
        UITableViewCell* swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath];
        // ...
  }
}
0 голосов
/ 29 июня 2018

Добавление жеста в методе AwakeFromNib работает без проблем.

class TestCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

        let panGesture = UIPanGestureRecognizer(target: self,
                                            action: #selector(gestureAction))
        addGestureRecognizer(panGesture)
    }

    @objc func gestureAction() {
        print("gesture action")
    }
}
0 голосов
/ 22 марта 2014

У меня была такая же проблема, и я решил ее, отметив «Scrolling Enabled» в атрибутах табличного представления.

Моему табличному представлению не нужна прокрутка, поэтому он никак не влияет на приложение., за исключением того, что теперь я не получаю первое не отвечающее нажатие после жеста смахивания.

0 голосов
/ 18 февраля 2012

Будет работать с делегатом приложения

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{

// code

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...