2012-06-17 12 views
15

Ich habe eine UITableView mit einer benutzerdefinierten UITableViewCell erstellt. Meine Zelle enthält eine UIImageView auf der linken Seite und UITextView auf der rechten Seite.Wie kann ich unterscheiden, welcher Teil von UITableViewCell geklickt wurde

Inside UITableViewController, ich setze sowohl Bild als auch Text in der Tabellenansicht cellForRowAtIndexPath.

Alles zeigt gut, aber jetzt muss ich didSelectRowAtIndex implementieren und ich muss unterscheiden, ob UIImageView oder UITextView der Zelle angeklickt wurde.

Angenommen, das Klicken auf ein Bild repräsentiert die Löschaktion und den Rest der Bearbeitungsaktivität der Zelle.

Antwort

48

Anstatt die Gestenerkenner zu jeder einzelnen Zelle hinzuzufügen, können Sie der Tabellenansicht eine hinzufügen und bestimmen, welche Zelle aus dem Berührungspunkt des Benutzers ausgewählt wurde, und dann bestimmen, ob der Benutzer das Bild oder die Zelle berührt hat.

Stellen Sie zuerst sicher, dass Ihr Controller das UIGestureRecognizerDelegate-Protokoll annimmt.

@interface MyTableViewController() <UIGestureRecognizerDelegate> 
@end 

Dann wird die UIGestureRecognizer zum UITableView, wenn die Ansicht Lasten hinzu.

Diese Delegiertenmethode bestimmt, ob die Methode handleTap: ausgeführt werden soll. Wenn es einen indexPath von den Benutzern finden kann, gibt es YES zurück, andernfalls gibt es NO zurück.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    UITableView *tableView = (UITableView *)gestureRecognizer.view; 
    CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view]; 
    if ([tableView indexPathForRowAtPoint:p]) { 
     return YES; 
    } 
    return NO; 
} 

Sobald wir, wenn der Benutzer in einer Zelle geklickt hat festgestellt haben, die handleTap: ist Methode aufgerufen, die dann entscheidet, ob der Benutzer das Bild berührt, oder jede andere der Zelle Teil.

- (void)handleTap:(UITapGestureRecognizer *)tap 
{ 
    if (UIGestureRecognizerStateEnded == tap.state) { 
     UITableView *tableView = (UITableView *)tap.view; 
     CGPoint p = [tap locationInView:tap.view]; 
     NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p]; 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
     CGPoint pointInCell = [tap locationInView:cell]; 
     if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) { 
      // user tapped image 
     } else { 
      // user tapped cell 
     } 
    } 
} 
+0

Für diejenigen, die nicht wissen. Alle 'UITapGestureRecognizer' Einstellungen in' viewDidLoad' können auch im Xcode UI Layout (alias IB) vorgenommen werden. Sie sollten den Rückgabetyp von 'handleTap:' in 'IBAction' ändern. – ThomasW

1

eine sehr abstrakte und allgemeine Antwort ist die folgende Für jede UIImage zu tun und UILabel Sie ihren Tag Set In den indexPath.row

//When creating the label and image add a recognizer to them 
label.tag = indexPath.row; 
imageView.tag = indexPath.row; 

Dann fügen Sie auf jedem Bild und Etikett eine UITapGestureRecognizer zu sein, wie so

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                       action:@selector(handleTap:)]; 
    [label addGestureRecognizer:recognizer]; 
    [imageView addGestureRecognizer:recognizer]; 
} 

- (void) handleTap:(UITapGestureRecognizer*)recognizer 
{ 
    UIView *view = recognizer.view; 
    int row = view.tag; 
    if ([view isKindOfClass:[UILabel class]]) { 
     //Row is row 
     //and the label is pressed 
    } 

    if ([view isKindOfClass:[UIImageView class]]) { 
     //Row is row 
     //and the imageview is pressed 
    } 
} 
5

Sie könnten Unterklasse UITableViewCell und überschreiben touchesEnded.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    [super touchesEnded:touches withEvent:event]; 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self]; 

    UIView *hitView = [self hitTest:location withEvent:event]; 

    if (hitView == myImageView) ...; 
    if (hitView == myTextView) ...; 
} 

Sie benötigen einen Hinweis auf Ihre UIImageView zu halten und UITextView (sie wahrscheinlich Eigenschaften Ihrer Zelle sein sollte).

Sie können natürlich touchesBegan statt touchesEnded überschreiben, hängt davon ab, welche Funktionalität Sie erreichen möchten.

0

Sie zwei Option zu implementieren: - 1 - UITapGestureRecognizer in Ihrem „UITableViewCell“ hinzufügen und auf Bildansicht und übergibt „indexPath“ als Parameter der Delegierten zum Wähler und macht Punkt übergehen zu lassen es

tableviewcell
UILabel *label = =[UILabel alloc]init]; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = 
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]  autorelease]; 
[label addGestureRecognizer:tapGesture]; 


-(void)labelTap{ 
[delegate [email protected](labeltapped:)withobject:indexpath]; 
} 

2- Zweite Möglichkeit ist, den Absender von DidSelectRowAtIndexPath des Typs [Imageview oder Label]; aber ich bevorzuge die erste Möglichkeit

1

Machen Sie das Bild ein UIButton. Wenn die Aktion der Schaltfläche ausgelöst wird, wissen Sie, dass der Benutzer auf das Bild geklickt hat (die Zelle wird NICHT ausgewählt). Wenn Zelle ausgewählt ist, wissen Sie, dass der Benutzer an einer anderen Stelle in der Zeile (einschließlich Textansicht oder Beschriftung) angetippt hat.

Setzen Sie auch die Tag-Eigenschaft der Schaltfläche auf z. den Zeilenindex der Zelle, damit Sie wissen können, welches Bild der Zeile angetippt wurde.

+0

Aber wie es ist, diese Seitenhiebe nicht verarbeitet, wenn das, was Sie suchen ... –

Verwandte Themen