2013-08-10 16 views
27

Tworzę jedną aplikację opartą na widoku tabeli. Stworzyłem niestandardową komórkę tabeli dla tabeli, która zawiera 2 etykiety, 1 obraz i 1 przycisk. Widok tabeli Metoda źródła danych działa poprawnie. Używam xib zarówno dla klasy niestandardowej komórki i kontrolera widoku, jak i do połączenia właściciela i źródła danych z właścicielem pliku. Ale problem występuje, gdy wybieram wiersz tabeli, didSelectRowAtIndexPath się nie uruchamia. Jak wspomniano, jedynym sposobem na ogień jest przytrzymanie komórki przez około 3-4 sekundy. Czy ktoś ma pojęcie, dlaczego tak się dzieje?iphone - didSelectRowAtIndexPath: wywoływane tylko po długim naciśnięciu niestandardowej komórki

Dzięki za wszelkie wskazówki ...

Oto mój widok tabeli metody ..

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [finalAddonsArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil]; 
     cell=[nib objectAtIndex:0]; 
    } 

    Addons *addons1=[[Addons alloc]init]; 
    addons1= [finalAddonsArray objectAtIndex:indexPath.row]; 

    if (addons1.data == nil) { 
     cell.ivCategory.image = [UIImage imageNamed:@"blogo.jpg"]; 
    } 
    else 
    { 
     cell.ivCategory.image=[UIImage imageWithData:addons1.data]; 
    } 

    cell.lblTitle.text = addons1.name; 
    if (addons1.price == nil) { 
     cell.lblPrice.text = nil; 
    } 
    else{ 
     cell.lblPrice.text = [NSString stringWithFormat:@"%@ rs",addons1.price]; 
    } 
    [cell.button addTarget:self 
        action:@selector(editButtonPressed:) 
      forControlEvents:UIControlEventTouchUpInside]; 

    cell.button.tag=indexPath.row; 
    index = indexPath; 
    cell.selectionStyle = UITableViewCellSelectionStyleGray; 

    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"sjcjksbcjksbcfkebscf1234567890"); 
} 

Jeszcze jedno Dostaję że jeśli używam domyślnego UITableViewCell zamiast niestandardowych komórki następnie także mój problem jest taki sam, metoda delegata nie jest rozpalana.

właściwości komórek niestandardowe:

enter image description hereenter image description here

+0

Gdzie jest metoda 'didSelectRowAtIndexPath'? – geekchic

+0

Dlaczego określasz, że zostanie zwolniony z opóźnieniem? Czy jesteś absolutnie pewien, że zajmuje to 3-4 sekundy, czy też działanie, które według ciebie ma miejsce, występuje tylko wtedy? Dodaj NSLog lub punkt przerwania do pierwszej linii didSelectRowAtIndexPath. Również - jaki jest rozmiar przycisku w komórce? – Stavash

+0

@nikhita Aktualizuję moje pytanie za pomocą metody didSelectRowAtIndexPath. –

Odpowiedz

84

ten sam problem wystąpił u mnie, ponieważ dodałem do niego wykrywacz gestów dotykowych. Jeśli korzystasz z dowolnego aparatu do rozpoznawania gestów, spróbuj go usunąć i sprawdź, czy nie powoduje problemu.

EDIT: Rozwiązanie jak skomentował przez Ali: Jeśli korzystałeś gest z kranu można używać [tap setCancelsTouchesInView:NO];

+0

@ parserThanks, same pblm miałem. delegat nie strzelał bcoz gestem kranu –

+0

Świetnie ... wskazałeś powód problemu .... ale jakie jest rozwiązanie tego ... Mam kilka pól tekstowych w widoku i chcę odrzucić klawiaturę z kranu. Jak mogę to zrobić ? –

+13

W swoim gestu dotykowym dodaj to [stuknij: setCancelsTouchesInView: NO]; ' –

-2

nie jestem tego pewien, ale Delays Content Touches może mieć coś z tym zrobić.

+0

Nie dostaję. –

+0

Na pierwszym zrzucie ekranu, w sekcji 'ScrollView', włączona jest właściwość' Opóźnienia dotknięcia zawartości'. Spróbuj go wyłączyć i przetestować. – n00bProgrammer

+0

nadal to nie działa. –

1

miałem do czynienia z podobnym problemie:

Dla mnie problemem było to, ponieważ mój UITableView było dodano do UIScrollView, a dokładniej do jego contentView. Wygląda na to, że wewnątrz contentView musiałem pozostać przez 2-3 sekundy, aby uruchomić metodę didSelectRowAtIndexPath.

Przenieśliłem swój TableView do self.view zamiast contentView i to rozwiązało problem!

+0

Nie Dokładnie, ale wskazał mi we właściwym kierunku ;-) –

0

Drogi, w obliczu tego samego problemu. Kiedy stuknąłem w komórkę, ale didselectrowindexpath nie została wywołana, ponieważ została nagle wywołana, gdy zwolniłem przycisk po naciśnięciu go przez kilka sekund.

Jeśli stoją ten sam problem nie musi być 1. UITapGestureRecognizer że stwarza problem dla ciebie lub 2. rzutem zwój, w którym umieścił Cię widok tabeli.

Zatem należy usunąć lub super gest przewijania widoku, w którym twój widok tabeli jest umieszczony

1

Może wywołać metodę

[tableView deselectRowAtIndexPath:indexPath animated:NO];

przed push ViewController lub innej operacji. Podobnie jak

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

    // 1. manual call this method to deSelect Other Cell 
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    // 2. than do other operation 
    PushViewController Or Some Animation .... 
} 

który rozwiązuje mój problem.

0

Jeśli masz niestandardowy gest obiektu w widoku, sprawdź delegata override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool. Porównaj gest niestandardowy z gestem nadawcy, Jeśli nie jest to gest niestandardowy, przekaż go super. Więc gesty/dotknięcia systemu nie zostaną zablokowane.

Powiązane problemy