UITableView didSelectRowAtIndexPath: non essere chiamato al primo tocco


352

Sto riscontrando un problema con UITableView's didSelectRowAtIndexPath.

La mia tabella è impostata in modo tale che quando seleziono la riga inizializza un nuovo controller di visualizzazione e lo spinge.

La prima volta che tocco una riga nella tabella, il metodo non viene chiamato. Una volta selezionata un'altra riga, inizia a funzionare normalmente.

Ho verificato questo impostando un punto di interruzione su didSelectRowAtIndexPath. Quando aggiungo un NSLogmetodo, vedo che quando seleziono la seconda riga che spinge finalmente il nuovo controller di visualizzazione, vedo apparire contemporaneamente due istruzioni di registro nella console.

Eventuali suggerimenti?


2
Puoi pubblicare il tuo codice per tableView:didSelectRowAtIndexPath:?
gerry3,

Ho avuto lo stesso problema, controllare la mia risposta: stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
Spedizione in coda principale risolto il mio problema stackoverflow.com/questions/20149167/...
durgeshtrivedi

Risposte:


1356

Qualche possibilità che hai digitato accidentalmente De selectRowAtIndexPath?


17
@Dschee non viene chiamato al primo tocco perché non stai deselezionando nulla. Una volta selezionata una riga, quando si tenta di selezionarne una seconda, la prima viene deselezionata.
Il ragazzo il

19
Ecco perché ADORO.
elbuild

4
Ho votato questo non perché ho commesso questo errore una volta. Ho votato perché ho fatto questo errore non meno di 4 volte in altrettanti anni, costando così tanto tempo.
Brooks Hanes,

8
OH MIO DIO!! Questo potrebbe essere il peggior bug che ho introdotto nel mio codice.
Shantanu Paul,

4
WOW. Mi hai risparmiato così tanto tempo.
MortalMan,

24

Controlla anche la proprietà di selezione della vista tabella nel file xib. Utilizzare 'Selezione singola' o 'Selezione multipla' come richiesto.


2
Ba ah ah ah! Wow, ho trascorso 4 ore a cercare di capirlo. @includeMe in soccorso (saluto)! Grazie!

17

Ho riscontrato il seguente problema:

  • prima tocca in fila -> nessun effetto, nessuna selezione, mai
  • secondo tocco e seguenti -> comportamento di selezione corretto, sempre

Nel mio caso, il mio errore stava verificando Show Selection on Touchin Interface Builder. Puoi deselezionarlo in IB qui:

inserisci qui la descrizione dell'immagine

Spero che aiuti qualcuno


Tu sei il mio eroe! Qualche idea sul perché questo è il valore predefinito? Non riesco a pensare a nessuna app che abbia quel comportamento e penso che questo sia un default molto strano.
Christophe Fondacci,

12

Verifica se nella tua classe sono stati impostati riconoscitori di gesti. Rimozione del gesto ha funzionato per me.


Ho entrambi; Riconoscimento gestuale e didSelectRowAtIndexPath? Tuttavia, sempre il riconoscimento gesti prende la preferenza. Impossibile arrivare al secondo. C'è un modo per gestire entrambi o devo liberarmi del riconoscimento dei gesti? Grazie!
Ron,

questo deve essere al top :) mi è costato 1 ora dopo 7 anni nello sviluppo di iOS.
Clown

6

Ho discusso anche pubblicando questa risposta perché penso che le stelle siano state allineate in modo che questo si manifestasse.

Sto riscontrando una variazione di questo problema e ho verificato le altre soluzioni. Nella mia vista tabella non elabora l'ultima riga della mia tabella al primo tocco. Lo evidenzia, ma didSelectRowAtIndexPathnon viene chiamato. Tutte le altre righe funzionano bene. Ma se accendo il rimbalzo di tableview, allora sembra risolvere il problema (ma poi devi affrontare un rimbalzo di tableview).


Hai trovato il motivo per cui questo sta accadendo? Ho esattamente lo stesso problema. Quando disattivo il rimbalzo della tabella, la prima / ultima riga della tabella non reagisce al primo tocco. Ho pensato che fosse un bug ma è più di un anno e sta ancora accadendo.
filip.karas,

No. Ho appena attivato il rimbalzo della vista da tavolo e l'ho lasciato a quello.
Chase Roberts

Sto riscontrando questo problema solo su un iPhone 5 (iOS 10.3) - L'attivazione di rimbalzo sul mio tableview lo ha risolto. Molto strano!
Lee Probert,

4

UITableViewCellSelectionStyleNone è stato impostato per la cella che visualizza quel problema (ios9).

Ho finito per chiamare

[tableView deselectRowAtIndexPath:indexPath animated:NO];

prima cosa dentro

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

che non è lo stesso, ma è abbastanza buono. mi chiedo che tipo di rottura del tavolo porta iOS10.


Questo ha funzionato per me, ma ho bisogno di una soluzione alternativa per nascondere la selezione senza fare il suo stile Nessuno. Ho eseguito l'override setSelectedma mentre l'utente tiene in mano la cella, la selezione appare inaccettabile
MMujtabaRoohani

1

SWIFT 2

Assicurati di avere questo set su true:

self.tableView.allowsSelection = true

Metti questo sopra la tua destra dopo il tuo viewDidLoad()e prima delsuper.viewDidLoad()


1

SWIFT 3

Se stai lavorando con Swift 3 in una classe che non è una UITableViewControllere che stai utilizzando UITableViewDelegate, potrebbe essere necessario utilizzare il titolo del metodo:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

Questo ha funzionato per me, anche se ho appena migrato il mio progetto su Swift 3. È abbastanza nuovo, quindi potrebbe essere risolto in seguito.


1

Se hai impostato UITapGestureRecognizer nella tua classe, puoi aggiungere questa riga in didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

Questo ha funzionato per me.


1

questo problema si verifica anche quando si lavora con il riconoscimento gesti all'interno di una tabellaVisualizza in questo caso non è necessario rimuoverli, è necessario solo assicurarsi che la proprietà del gesto cancelsTouchesInView = falsesia un valore booleano che influisce sul fatto che i tocchi vengano consegnati a una vista quando un gesto è riconosciuto.


0

SWIFT 3

Nessuna delle altre risposte ha funzionato nel mio caso, ciò che l'ha risolto per me è stato:

tableView.delaysContentTouches = false


0

didSelectRowAtLa funzione non è stata richiamata nella mia app al primo o al secondo tocco ... Stavo cercando di risolvere il problema. Non trovavo alcuna soluzione. Ma improvvisamente stavo riconoscendo, stavo usando view.animation cambio colore ... il Delegatemetodo non è stato chiamato mentre l'animazione persiste


0

Nel mio caso avevo un'intestazione di sezione UITableView con un riconoscimento dei gesti. Quando si tocca l'intestazione, dovrebbe inserire alcune righe in quella sezione e animare l'inserimento (come la sezione di espansione / compressione). La prima volta quando viene espanso e toccato, il metodo delegato didSelectRow non è stato attivato. Per ulteriori tocchi e azioni di espansione / compressione, funzionava come previsto.

Per risposta di @Ayoub Nouri ho impostato cancelsTouchesInView su false e questo ha risolto il problema. tapGestureRecognizer? .cancelsTouchesInView = false


0

Rapido 4.2

La disabilitazione di "Ritardo ritocco verso il basso" nella finestra di ispezione degli attributi ha risolto il problema.
Successivamente i clic sono fluidi e didSelectRowAt si attiva immediatamente.

Ispettore degli attributi XCode


0

Quello che ha funzionato per me è stato iniziare a digitare "didSelect ..." e quindi lasciare che il resto si completasse automaticamente. Apparentemente alcuni dettagli della mia sintassi erano traballanti. Come altri hanno già detto, usa l'IDE !!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.