Domanda

Sto scrivendo un'app iOS con una vista tabella all'interno di una vista scheda. Nel mio UITableViewController , ho implementato -tableView: didSelectRowAtIndexPath: , ma quando seleziono una riga in fase di esecuzione, il metodo non viene chiamato. Tuttavia, la visualizzazione tabella viene popolata, quindi so che vengono chiamati altri metodi tableView nel mio controller.

Qualcuno ha qualche idea di cosa avrei potuto rovinare per farlo accadere?

È stato utile?

Soluzione

Sembra che forse la classe non sia UITableViewDelegate per quella vista tabella, anche se si suppone che UITableViewController lo imposti automaticamente.

Qualche possibilità che ripristini il delegato su un'altra classe?

Altri suggerimenti

Nel caso in cui qualcuno abbia commesso lo stesso stupido errore che ho fatto io:

Verifica se il nome del metodo di quello che ti aspetti di essere didSelect potrebbe essere accidentalmente ottenuto in qualche modo didDeselect . Ho impiegato circa due ore per scoprirlo ...

Un'altra cosa che potrebbe causare il problema non è il tipo di selezione selezionato:

UITableView tipo di selezione

Dovrebbe essere Selezione singola per la selezione normale, non dovrebbe essere Nessuna selezione .

Un'altra possibilità è che un UITapGestureRecognizer stia mangiando gli eventi, come nel caso qui: https://stackoverflow.com/a / 9248827/214070

Non sospettavo questa causa, perché le celle della tabella continuavano a evidenziare in blu come se i tocchi stessero passando.

Tutte le risposte valide, ma ce n'è un'altra da cercare ...

(In particolare quando si crea un UITableView a livello di codice)

Assicurati che tableView possa rispondere alla selezione impostando [tableView setAllowsSelection: YES]; o rimuovendo qualsiasi riga che lo imposta su NO .

Se il problema si presenta con UITapGestureRecognizer puoi risolvere questo problema:

  • nello Storyboard:

inserisci qui la descrizione dell'immagine

nel codice con Objective-C :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

nel codice con Swift :

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

Ho riscontrato due cose in queste situazioni.

  1. Potresti aver dimenticato di implementare il protocollo UITableViewDelegate o non ci sono punti di delega tra la tua classe e la vista della tabella.

  2. Potresti avere un UIView nella tua riga che è un primo risponditore e ti toglie i clic. Pronuncia un pulsante UIB o qualcosa di simile.

Ho avuto lo stesso problema. Ed è stato difficile da trovare. Ma da qualche parte nel mio codice era questo:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

Deve essere return indexPath , altrimenti -tableView: didSelectRowAtIndexPath: non viene chiamato.

Se hai aggiunto un gestureRecognizer sopra UITableView, didSelectRowAtIndexPath non verrà chiamato.

Quindi è necessario utilizzare il metodo delegato gestureRecognizer per evitare il tocco in una vista particolare.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

Ho riscontrato un problema in cui dopo mesi di mancata visualizzazione del mio codice ho dimenticato di aver implementato il seguente metodo a causa di alcuni requisiti che non erano necessari

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

Dovrebbe essere restituito SÌ per una riga per renderlo selezionato.

DEVI selezionare queste opzioni

 inserisci qui la descrizione dell'immagine

ma se si desidera rendere UITableView non evidenziato facendo clic, è necessario apportare modifiche alle proprietà UITableViewCell .

Scegli Nessuno per l'opzione Selezione, proprio come sotto

 inserisci qui la descrizione dell'immagine

Avevo messo un UITapGestureRecognizer sulla vista del mio tavolo per chiudere la tastiera che impediva di chiamare didSelectRowAtIndexPath: . Spero che aiuti qualcuno.

Nel caso in cui tu abbia lo stesso problema: Apparentemente, questo metodo non verrà chiamato se tableView è in modalità di modifica. Devi impostare allowSelectionDuringEditing su true.

Tramite questa domanda: Durante la modifica, `UITableView` non chiama didSelectRowAtIndexPath ??

Ho avuto lo stesso problema,

Il motivo è stato l'utilizzo di UITapGestureRecognizer . Volevo che la tastiera si chiudesse quando toccavo altrove. Mi sono reso conto che questo ha la precedenza su tutte le azioni di tocco, ecco perché la funzione didSelectRowAtIndexPath non ha chiamato.

Quando commento le righe relative a UITapGestureRecognizer , funziona. Inoltre puoi controllare nella funzione di UITapGestureRecognizer selector se il tocco è UITableViewCell o no.

Per Xcode 6.4, Swift 1.2. La selezione " tag " era stato modificato in IB. Non so come e perché. Impostandolo su " Selezione singola " ha reso di nuovo selezionabili le celle di visualizzazione tabella. inserisci qui la descrizione dell'immagine

Nel mio caso, didSelctRowAtIndexPath che non ha chiamato è dovuto al fatto che ho selezionato nessuno nella proprietà Selezione di tableView, impostato su selezione singola risolto il mio problema

 inserisci qui la descrizione dell'immagine

Anche se è stata accettata un'altra risposta, aggiungerò un altro possibile problema e soluzione per le persone che osservano questo problema:

Se il conteggio dei riferimenti automatico (ARC) è attivato, è possibile che anche dopo aver assegnato il controller come delegato della vista, i messaggi della vista al controller non vengano ricevuti perché ARC sta eliminando il controller. Apparentemente il puntatore delegato di UITableView non conta come riferimento per ARC, quindi se questo è l'unico riferimento ad esso, il controller verrà distribuito. Puoi verificare se ciò sta accadendo implementando il metodo dealloc sul controller e impostando un breakpoint o una chiamata NSLog lì.

La soluzione è tenere traccia del controller con un forte riferimento altrove, fino a quando non si è sicuri di non averne più bisogno.

Ricorda di impostare l'origine dati e delegare nel metodo viewDidLoad come segue:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

Il mio problema non era nessuno dei precedenti. E così zoppo. Ma ho pensato di elencarlo qui nel caso aiuti qualcuno.

Ho un tableViewController che è il mio " base " controller e quindi creo sottoclassi di questo controller. Stavo scrivendo tutto il mio codice nella tableView: didSelectRowAtIndexPath nella routine " base " classe. Dimenticando completamente che di default questa routine era stata creata (anche se senza codice che faceva nulla) anche in tutte le mie sottoclassi. Quindi, quando ho eseguito la mia app, ha eseguito la versione della sottoclasse del codice, non ha fatto nulla e mi ha reso triste. Quindi, ovviamente, una volta rimossa la routine dalle sottoclassi, ha usato mt "base" routine di classe e sono in affari.

Lo so. Non ridere. Ma forse questo salverà qualcuno l'ora che ho perso ...

Dando i miei 2 centesimi su questo.

Avevo un UITableViewCell personalizzato e c'era un pulsante che copriva l'intera cella, quindi quando si verificava il tocco, il pulsante veniva selezionato e non la cella.

O rimuovo il pulsante o, nel mio caso, ho impostato Abilita interazione utente su false sul pulsante, in questo modo la cella era quella selezionata.

Se leggi questo, quindi non risolve ancora il problema.

Ho una cella personalizzata , dove la casella di controllo " Interazione utente abilitata " era disabilitato. Quindi, lo accendo e basta. In bocca al lupo.

Ho appena avuto questo e come è successo a me in passato non ha funzionato perché non ho prestato attenzione al completamento automatico quando ho provato ad aggiungere il metodo e alla fine ho implementato tableView: didDeselectRowAtIndexPath : anziché tableView: didSelectRowAtIndexPath: .

So che è vecchio e il problema è stato risolto, ma si è verificato un problema simile, ho pensato che il problema fosse con il mio UITableViewCell personalizzato, ma la soluzione era completamente diversa: riavvio XCode :) e poi funziona bene! quasi come Windows :)

Se la visualizzazione della tabella è in modalità di modifica (ad es. [tableView setEditing: YES animato: NO]; ), è necessario impostare tableView.allowsSelectionDuringEditing = YES;

Assicurati di aver implementato tableView: didSelectRowAtIndexPath e non tableView:didDeSelectRowAtIndexPath

Questo mi ha procurato più di un paio di occasioni !!

Un altro errore che avresti potuto fare (come ho fatto io): se imposti un follow nella cella, didSelectRowAtIndexPath non viene chiamato. Dovresti invece impostare i tuoi follower sul view controller.

Nessuna di queste risposte ha funzionato per me. Dopo circa un'ora, ho capito qualcosa di molto insidioso:

Ho una vista tabella all'interno di una cella di un'altra vista tabella. Ho deciso, tra le altre cose, di creare una vista chiusa che contenga la vista tabella interna. Ho chiamato questa vista contentView e l'ho collegato in xib.

Si scopre che UITableViewCell ha già un contentView e fa cose strane con esso. Il problema si è risolto quando ho rinominato la proprietà in mainContentView e ricollegato la vista a questa proprietà rinominata.

Nel mio caso, calcolo dinamicamente l'altezza del SuperView del TableView al momento del caricamento. A causa di un errore di calcolo, il TableView è stato posizionato al di fuori del SuperView . TableView è stato disegnato bene, tuttavia tutte le interazioni sono state disabilitate (e didSelectRowAtIndexPath non è mai stato chiamato). Molto difficile da rilevare, poiché non vi è alcuna indicazione visiva che il TableView non sia "accessibile".

Nel mio caso la soluzione era cambiare NO in SÌ nella funzione seguente.

iOS 9+

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

Ok, aggiornando qui appena ho riscontrato questo problema, e il mio problema era leggermente diverso da quello trovato qui.

Ho cercato in IB e ho visto che il mio delegato era impostato, ma era impostato in modo errato su VISUALIZZA anziché su Proprietario file (fare clic con il tasto destro del mouse sulla vista tabella per vedere dove punta il delegato).

Spero che aiuti qualcuno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top