2012-07-13 14 views
10

Ho un UITableView che utilizza un array per elencare i dati. Funziona bene Ho anche un UISearchBar per la ricerca in quella vista tabella. Quando i dati sono abbinati nell'array tableviews, tali righe vengono aggiunte a un altro array mutabile e cellForRowAtIndexPath: visualizza invece i dati da tale array mutabile.numberOfRowsInSection: non chiamato su reloadData

Ma numberOfRowsInSection: non viene mai chiamato quando chiamo reloadData. Quindi la visualizzazione tabella si blocca durante lo scorrimento, perché sta cercando di ottenere dati dall'array mutabile, ma per le righe nell'array originale (che ha più elementi)

Ho eseguito il debug per un po 'di tempo ora, ma non posso perché l'amore di Dio trova le ragioni per questo. L'origine dati e il delegato sono collegati nella vista tabella, in quanto possono mostrare i dati dall'array originale.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"isSearching: %d", isSearching); 
    // Return the number of rows in the section. 
    if(!isSearching) 
     return [originalArray count]; 

    NSLog(@"isSearching - Return searchCopyListOfItems"); 
    return [searchCopyListOfItems count]; 
} 

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

    if(cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 

    if(!searching) 
     cell.textLabel.text = [originalArray objectAtIndex:indexPath.row]; 
    else 
     cell.textLabel.text = [searchCopyListOfItems objectAtIndex:indexPath.row]; 

    return cell; 
} 
+0

Controllare se la tabella ha memoria quando la si sta ricaricando .. –

risposta

5

come ricarichi il tuo tavolo? facendo [table relaodData]; giusto? la tua tabella è collegata a IBOutlet sul tuo pennino? al punto di ricarica, è table inizializzato?

puoi postare anche info sugli arresti anomali.

+2

Grazie per il suggerimento. In qualche modo, IB aveva disconnesso l'IBOutlet da UITableView nello xib. Non ho notato che non era collegato perché i dati originali sono stati mostrati correttamente. Tuttavia, col senno di poi mi rendo conto che questo non è dovuto all'output di riferimento, ma a causa delle connessioni delegate e dell'origine dati –

+0

ho fatto lo stesso errore, ho dimenticato di collegare l'uscita datasource al controller di visualizzazione. –

9

Essere sicuri di non chiamare reloadData dall'interno di uno qualsiasi dei metodi delegato della vista tabella. Ciò causerà un comportamento imprevedibile. Inoltre, assicurati di non aver chiamato prima il beginUpdates e di chiamare solo il tuo metodo reloadData dal thread principale.

+0

MOLTO buon punto – Elmo

+0

Grazie per il suggerimento riguardante 'beginUpdates'! –

-2

Prova

[self.tableView reloadData]; 
0

Il problema per me era che il numero spense-out di sezioni restituito 0, e anche se io non avevo intenzione di utilizzare le sezioni, ci deve essere 1 in quanto è più elevato in la gerarchia di oggetti di file: https://stackoverflow.com/a/26632808/1449799

1

ho avuto lo stesso problema di oggi con XCode 6.1

Nel mio codice, ho avuto la dataSource e delegate set:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    self.tableView.dataSource = self; 
    self.tableView.delegate = self; 
} 

... e stranamente, il mio codice avrebbe popolare la tabella quando caricato per la prima ... ma poi ignorato tutte le chiamate a reloadData.

Nello Storyboard, quando ho fatto clic con il pulsante destro del mouse su Vista tabella nello Storyboard, il pulsante di opzione "outlet" era un cerchio vuoto.

Ho trascinato una linea da questo cerchio vuoto al genitore UIView, e quindi il reloadData ha funzionato bene.

enter image description here

In qualche modo, avevo perso il legame tra il mio IBOutlet controllo UITableView ei file .h/.m utilizzati per popolarlo.

0

Per me, il Gotcha era che stavo cercando di incrementare un valore e restituirlo a partire numberOfSectionsInTableView

vale a direreturn someValue++

A quanto pare questo non è possibile, e nel mio caso, non è stato l'incremento someValue 0-1, e quindi il ritorno 0 sezioni, e quindi non vi era alcun motivo per il numberOfRowsInSection: da chiamare!

3

serestituisce 0, numberOfRowsInSection non verrà chiamato.

Problemi correlati