2012-06-17 14 views
15

Utworzono UITableView z niestandardowym UITableViewCell. Moja komórka zawiera po jednym UIImageView i UITextView po prawej.jak mogę odróżnić, która część UITableViewCell została kliknięta

Wewnątrz UITableViewController ustawiam obraz i tekst w widoku tabeli cellForRowAtIndexPath.

Wszystko wygląda dobrze, ale teraz muszę zaimplementować didSelectRowAtIndex i muszę rozróżnić, czy kliknięto komórkę UIImageView lub UITextView.

Załóżmy, że kliknięcie obrazu reprezentuje akcję usuwania i resztę akcji edycji komórki.

Odpowiedz

48

Zamiast dodawać funkcje rozpoznawania gestów do poszczególnych komórek, można dodać je do widoku tabeli i określić, która komórka została wybrana z punktu dotknięcia użytkownika, a następnie określić, czy użytkownik dotknął obrazu lub komórki.

Najpierw upewnij się, że kontroler przyjmuje protokół UIGestureRecognizerDelegate.

@interface MyTableViewController() <UIGestureRecognizerDelegate> 
@end 

następnie dodać UIGestureRecognizer do UITableView gdy widok obciążeń.Ta metoda delegatów określa, czy należy wykonać metodę handleTap:. Jeśli można znaleźć numer indexPath od użytkownika, to zwraca on YES w przeciwnym razie zwraca NO.

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

Po ustaleniu, czy użytkownik kliknął w komórce, który handleTap: wywoływana jest metoda, która decyduje, czy użytkownik dotknął obraz, lub dowolnej innej części komórki.

- (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

Dla tych, którzy nie wiedzą. Cała konfiguracja 'UITapGestureRecognizer' w' viewDidLoad' może być również wykonana w układzie Xcode UI (inaczej IB). Będziesz chciał zmienić typ zwrotu 'handleTap:' na 'IBAction'. – ThomasW

1

odpowiedzi bardzo abstrakcyjny i ogólny jest zrobić następujące Dla każdego UIImage i UILabel dodasz ustawionego znacznika być indexPath.row

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

Następnie dodać UITapGestureRecognizer na każdym obrazie i etykiety, tak jak

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

Można podać podklasę UITableViewCell i zastąpić 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) ...; 
} 

trzeba zachować pewne odniesienia do UIImageView i UITextView (powinny one prawdopodobnie właściwości komórce).

Oczywiście można zastąpić touchesBegan zamiast touchesEnded, w zależności od funkcji, którą chcesz osiągnąć.

0

masz dwie możliwości jest wdrożenie: - 1 - dodać UITapGestureRecognizer w „UITableViewCell” i uczynić z niego punkt aby zobaczyć i przekazać „indexpath” jako parametr do wyboru i sprawiają, że delegat przekazać go do 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- Drugim sposobem jest sprawdzenie nadawcy obiektu DidSelectRowAtIndexPath typu [widok obrazu lub etykieta]; ale preferuję pierwszy sposób:

1

Utwórz obraz jako UIButton. Po wywołaniu akcji przycisku wiesz, że użytkownik stuknął obraz (komórka NIE zostanie wybrana). Jeśli wybrana jest komórka, wiesz, że użytkownik został naciśniety w innym miejscu w wierszu (w tym w widoku tekstowym lub etykiecie).

Ustaw również właściwość znacznika przycisku na, np. indeks wiersza komórki, dzięki czemu można sprawdzić, który obraz wiersza został dotknięty.

+0

Ale jak to jest, to nie obsługuje swipes, jeśli to, czego szukasz ... –

Powiązane problemy