13

Nella mia vista tabella sono presenti celle personalizzate che inizializzo da una classe UITableViewCell. Ho sezioni per le prime lettere di record e ho un indexPath che viene creato dinamicamente.Custom CellIdentifier è null quando si utilizza il controller di ricerca di ricerca

Volevo aggiungere un controller di visualizzazione di ricerca al mio tableview. Così ho fatto, creato tutti i metodi per filtrare i dati. Sono sicuro che le mie funzioni stanno funzionando bene perché sto stampando il numero di array per lo screening dei risultati di ricerca.

Il mio problema è che la prima volta che la visualizzazione viene caricata, i dati sono visualizzati sullo schermo. Ma quando premo l'input di ricerca e digito una lettera, ricevo l'errore 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'. Dopo aver usato un punto di interruzione, ho visto che la mia cella personalizzata è nulla dopo la ricerca. I dati esistono, ma la cella non viene inizializzata.

ecco il codice che uso per l'inizializzazione di cella personalizzato:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"ObjectCell"; 

    SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    NSDictionary *myObject = [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 

    cell.label1.text = [myObject objectForKey:@"myValue"]; 
    return cell; 
} 

Credo ho fatto un errore quando mettere i controlli in IB. Così ho aggiunto le immagini di oggetti:

enter image description here

Connessioni ispettore per la mia vista tabella

Connections inspector for my table view

Connessioni ispettore per la mia ricerca display controller

enter image description here

EDIT: Problema è in realtà risolto, ho usato d a UISearchBar invece di Search Display Controller ma immagino che questo problema rimanga irrisolto. Quindi sono disposto a provare tutti i modi per farlo funzionare.

risposta

54

Come di qui search display controller question, è necessario accedere al self.tableView invece di tableView:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"]; 

    // do your thing 

    return cell; 
} 
+1

Questo potrebbe aver risolto il problema, ma per la maggior parte delle persone il problema è che non creano una nuova cella se non si è già in coda per UITableView. Le risposte sotto più appropriate spiegano come gestirlo. – FilmJ

+0

In realtà, a partire da iOS6, se si utilizza lo storyboard, la cella sarà sempre lì .. – nikravi

0

Non sono sicuro di come dovrebbe funzionare nel magazzino.

Ma normalmente si dovrebbe verificare se lo [tableView dequeueReusableCellWithIdentifier:CellIdentifier] restituisce una cella. Perché se la cella in non caricato prima o non ci sono eventuali cellule per riutilizzare sarà necessario creare un nuovo cellulare:

SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[SpeakerCell alloc] initWithIdentifier: CellIdentifier]; 
} 

Anche quando nel dichiarare variabili locali in Objective-C che tenda non capitalizzare il prima lettera.

+0

Nessuna interfaccia @ visibile per 'SpeakerCell' dichiara il selettore 'initWithIdentifier:'? – kubilay

+0

Hai configurato la cella come un "pennino"? Quindi dovrai caricare il 'nib' altro che puoi creare il metodo' initWithIdentifier' e impostare la cella in questo metodo. – rckoenes

+0

Non utilizzo alcun pennino, sto usando una classe UITableViewCell e dichiaro l'identificatore di cella in tableview. Cosa dovrebbe contenere il metodo initWithIdentifier? tornare in sé? a proposito, perché non scrivere mai le prime lettere in Objective-C? La maggior parte degli esempi contiene così, non sapeva che era sbagliato. – kubilay

2

Per coloro che utilizzano iOS 5 e storyboard, si vorrebbe utilizzare il seguente metodo, invece di initWithIdentifier:

initWithStyle: (UITableViewCellStyle) stylereuseIdentifier: (NSString *) reuseIdentifier

Esempio:

NSString *cellIdentifier = @"ListItemCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 
0

Ho avuto lo stesso problema, con le cellule su misura (costruito nel Storyboard), non in fase di elaborazione, non appena la prima lettera è stata messa nel campo di ricerca. La ricerca ha avuto comunque successo.

Infine ho trovato un good tutorial from Brenna Blackwell che suggerisce di configurare manualmente il disegno della cella nella sottoclasse corrispondente di UITableViewCell, aggiungendo UILabels e altri elementi.

Problemi correlati