Ich füge eine UISwipeGestureRecognizer
an eine UITableViewCell
in der cellForRowAtIndexPath:
-Methode an:
- (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;
}
Die Methode didSwipe
wird jedoch bei erfolgreichem Swipe immer zweimal aufgerufen. Ich dachte zunächst, dass dies darauf zurückzuführen ist, dass die Geste beginnt und endet, aber wenn ich den GestureRecognizer selbst abmelde, befinden sich beide im Zustand "Ended":
-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"did swipe called %@", gestureRecognizer);
}
Konsole:
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>
Ich weiß wirklich nicht warum. Ich habe natürlich versucht, nach dem Ended-Status zu suchen, aber das ist keine Hilfe, da beide sowieso als "Ended" erscheinen ... Irgendwelche Ideen?
Anstatt die Gestenerkennung direkt zur Zelle hinzuzufügen, können Sie sie in viewDidLoad
zur Tabellenansicht hinzufügen.
In der didSwipe
- Methode können Sie den betroffenen IndexPath und die betroffene Zelle folgendermaßen bestimmen:
-(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];
// ...
}
}
Es wird mit dem App-Delegierten funktionieren
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
// code
}
Ich hatte das gleiche Problem und löste es, indem ich in den Attributen der Tabellensicht "Scrolling Enabled" anklickte.
Meine Tabellenansicht muss nicht gescrollt werden, daher hat sie keine Auswirkungen auf die App, außer dass ich jetzt nach einer Wischgeste nicht das erste nicht reagierende Antippen bekomme.
Das Hinzufügen von Gesten in der AwakeFromNib-Methode funktioniert problemlos.
class TestCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
let panGesture = UIPanGestureRecognizer(target: self,
action: #selector(gestureAction))
addGestureRecognizer(panGesture)
}
@objc func gestureAction() {
print("gesture action")
}
}