2011-11-09 22 views
24

Sto implementando un UITableView con UISearchDisplayController in xcode 4.2. UITableView & UISearchDisplayController sono creati in StoryBoard. I impostare la cella Identifier (SampleCell) per UITableView e accedervi comeios 5 UISearchDisplayController crash

cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"]; 

UITableView sta funzionando benissimo. Ma una volta provo a cercare, l'app si arresta in modo anomalo.

*** Assertion failure in -[UISearchResultsTableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:6072 
2011-11-09 22:22:16.058 SampleApp[14362:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

Credo che ho bisogno di impostare l'identificatore di cella per cella self.searchDisplayController.searchResultsTableView. Ma non so come. Grazie in anticipo per qualsiasi aiuto. =)

+0

+1 per voi salvato il mio tempo per la digitazione di un question.I fronte esatto problema sam. – thesummersign

risposta

16

Difficile bug da tracciare, sembra che ogni volta che si fa una ricerca viene creata una nuova tableview. Significa che la tua cella di registrazione deve essere tolta da ViewDidLoad poiché questo funzionerà solo per la prima ricerca. Invece utilizzare il seguente metodo delegato a fare la registrazione delle cellule e la personalizzazione:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    [self.searchDisplayController.searchResultsTableView 
    registerNib:[UINib nibWithNibName:@"YOURCELLNIB" bundle:nil] forCellReuseIdentifier:@"YOURCELLID"]; 
    self.searchDisplayController.searchResultsTableView.separatorColor = [UIColor clearColor]; 
} 
+0

+1.Avevo a che fare con un problema molto simile e ho scoperto che una volta rimosse tutte le chiamate su RegisterNib e le ho sostituite con un metodo diverso di caricamento delle celle, tutto funzionava bene. –

+0

Sai come gestire il suo ios5 con lo Stoaryboard? Ho creato la mia cella che estende UITableView e selezionato lo stile personalizzato nello storyboard. Funziona tutto bene ma quando si filtra il tablview la cella in cellforrowatindexpath è sempre nullo quindi ottengo l'errore: oltre all'erro sopra vedo *** Terminazione dell'app a causa dell'eccezione non rilevata 'NSInternalInconsistencyException', motivo: 'UITableView dataSource deve restituire un cell da tableView: cellForRowAtIndexPath. Come posso creare quella cella personalizzata che ho creato nel mio storyboard a livello di programmazione? – imrank1

+0

Grazie, grazie, grazie !!! Questo mi stava facendo impazzire, dal momento che dovevo necessariamente registrare un pennino per le celle SearchResultsTableView, e mettere il codice in viewDidLoad era chiaramente sbagliato. Se potessi revocare nuovamente la tua risposta, lo farei! –

83

Usa [self.tableView dequeue...], non [tableView dequeue...].

La cella si sta cercando di annullare l'accodamento è legata al del controller della vista primaria tableView nello storyboard, NON le searchDisplayController 's nuova creazione tableView (che non ha identificatori di cella ad esso collegati). Se si invia solo il messaggio "tableView", il messaggio di dequeue va al TableView searchDisplayController's poiché questo è ciò che è stato passato nel metodo cellForRowAtIndexPath: ....

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

    // do your thing 

    return cell; 
} 
+0

funziona come un fascino !! grazie mille! – Anthony

+11

(+1) la risposta dovrebbe essere accettata. – thesummersign

+0

Il nuovo problema è che il risultato della ricerca viene caricato in un popover che non è desiderato. posso in qualche modo usare il mio ('self.tableView') per visualizzare i risultati della ricerca? – thesummersign

10

(La risposta che consiglia di utilizzare self.tableview dipende da un'altra vista tabella. Questa è la soluzione più pulita e può essere utilizzato anche se il controller di ricerca è usato da solo.)

È è necessario registrare le celle su UITableView di UISearchDisplayController. Il modo migliore per farlo è registrare le celle quando viene caricata la vista tabella.

UISearchDisplayDelegate ha un metodo che ti avvisa quando viene caricata la vista tabella, proprio come viewDidLoad ma per la visualizzazione della tabella di ricerca.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView 
{ 
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"]; 
} 
+0

Questa è di gran lunga la soluzione migliore per evitare l'arresto anomalo dopo il primo caricamento! Voglio dire, se si limitassero a filtrare i dati _already_ recuperati, l'altro modo funzionerebbe come previsto. Ma se si dovrebbe essere in grado di fare ** ricerche remote **, la vista tabella dei motori di ricerca dovrebbe chiaramente non dipendere dalla vista tabella originale. – Hulvej

+2

Molto utile. Vedi anche: 'registerClass: forCellReuseIdentifier:' se le tue celle sono definite nel codice piuttosto che Interface Builder. – Nick

0

È possibile in

- (void)searchDisplayController:(UISearchDisplayController *)searchDisplayController didLoadSearchResultsTableView:(UITableView *)searchResultsTableView

fare

[searchResultsTableView registerNib:[UINib nibWithNibName:@"someNibName" bundle:nil] forCellReuseIdentifier:@"yourReuseId"];

Allora sei in grado di utilizzare in

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

normale

[tableView dequeueReusableCellWithIdentifier:

Problemi correlati