2010-08-12 16 views
7

Tengo splitViewController que tiene como MasterViewController algunos viewController y como DetailViewController algunos tableViewController. Cuando pulso un botón en masterViewController, quiero mostrar new tableViewController en detailViewController en lugar de uno existente.UITableView reloadData - cellForRowAtIndexPath no activado

así lo hice así:

SearchDetailViewController *searchDetailViewController = [[SearchDetailViewController alloc] initWithStyle:UITableViewStylePlain]; 
UINavigationController *searchDetailNavigationController = [[UINavigationController alloc] initWithRootViewController:searchDetailViewController]; 

Después de que yo estoy pasando los datos a mostrar en la nueva tableController:

[searchDetailViewController passInSearchResults:listOfItems]; 

Después de que "empujar" a nuevos controladores splitViewController:

[searchSplitViewController setViewControllers:[NSArray arrayWithObjects:self.navigationController, searchDetailNavigationController, nil]]; 

En el método tableViewController de destino se pasan los datos "passInSearchResults" y también llamo reloadDa ejército de reserva. Método parece que:

- (void)passInSearchResults:(NSMutableDictionary *)searchResults { 
    self.searchResultList = searchResults; 
    NSLog(@"Data is passed in: %@",self.searchResultList); 
    [self.tableView reloadData]; 
    //[self.tableView setNeedsDisplay]; 
} 

consola: Los datos se pasan en: [Aquí tengo los datos exactos que quiero y parece apenas a la derecha].

After this I see that method "numberOfRowsInSection" is fired: 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"Setting table length: %i",[self.searchResultList count]); 
    return [self.searchResultList count]; 
} 

Consola: Ajuste de la longitud tabla: [aquí llego longitud adecuada]

El problema es que la tabla no se llena con datos pasados ​​y método "cellForRowAtIndexPath" no se llama.

¿Cómo puede ser que en el método reloadData "numberOfRowsInSection" se active pero no el método "cellForRowAtIndexPath" ... ???

Gracias

Respuesta

4

¿Cómo puede ser que en el método reloadData "numberOfRowsInSection" se dispara pero no el método "cellForRowAtIndexPath" ... ???

Después de pasar un día con el mismo problema (ish), creo que hemos encontrado un error aquí. Sí encontré un truco/solución.

Si modifico la matriz (agregando/quitando valores o reconstruyéndolo por completo) que se usa en mi método cellForRowAtIndexPath, parece que se vuelve a llamar a cellForRowAtIndexPath cuando recarga datos.

Por ejemplo, en mi cellForRowAtIndexPath tengo algo como:

cell.textLabel.text = [[[self.searchResultsArrayWithSections objectAtIndex:indexPath.section] objectForKey:@"rowValues"] objectAtIndex:indexPath.row]; 

    return cell; 

también tener un método para construir esta matriz que es llamada en viewDidLoad:

- (NSMutableArray *)splitIntoSectionsWithAlphabet:(NSMutableArray *)myArray 
{  
NSString *letters = @"abcdefghijklmnopqrstuvwxyz"; 
NSMutableArray *content = [NSMutableArray new]; 

//code to build array here, nothing special really 

return content; 
} 

me he dado cuenta de que si específicamente, vuelva a llamar a este método en mi matriz searchResultsArrayWithSections antes de llamar a reloadData, realmente llama a todos los métodos de UITableViewDelegate correctamente. (como dije, piratear pero funciona!)

//dirty hack, bug with cancel button and not realoding data, seems we have to modify this array before it will work correctly 
self.customerListArrayWithSections = [self splitIntoSectionsWithAlphabet:self.customerListArray]; 
[self.customerListTv reloadData]; 
1

Tuve el mismo problema, pero la decisión fue muy simple. Antes que nada, ¿podrías intentar desplazar la tabla hacia abajo? tableView: cellForRow ... debe ser llamado. Verifique las alturas de los encabezados y contentOffset para tableView.

10

Comprobar si se encuentra en hilo principal al llamar [self.tableView reloadData];

- (void)passInSearchResults:(NSMutableDictionary *)searchResults { 
if ([NSThread isMainThread]) { 
    self.searchResultList = searchResults; 
    NSLog(@"Data is passed in: %@",self.searchResultList); 
    [self.tableView reloadData]; 
} 
else { 
    [self performSelectorOnMainThread:@selector(passInSearchResults:) searchResults waitUntilDone:NO]; 
} 

}

+1

No es necesario comprobar primero que se está ejecutando en el hilo principal. 'performSelectorOnMainThread' funciona, incluso cuando ya está en el hilo principal, al igual que' dispatch_async (dispatch_get_main_queue() '(que probablemente sea lo que realmente quiere aquí). Agregar el' if' aquí solo consume ciclos de procesador innecesarios. –

4

Compruebe sus numberOfRows, si es 0, no hay celdas para mostrar.

0

También puede asignar la tabla en el método init [With ...] de viewController y también tiene la misma propiedad cableada en IB. De esta forma es posible que se llame a los métodos number of delegate y que cellForRow ... no lo haga.

0

Mi "AutoLayouted" UITableView no llamó cellForRowAtIndexPath en reloadData, porque establecer el marco por error.

_tableView = [[UITableView alloc] initWithFrame:self.view.frame]; 
_tableView.translatesAutoresizingMaskIntoConstraints = NO; 

cambiándola a CGRectZero, funcionó ..

_tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
_tableView.translatesAutoresizingMaskIntoConstraints = NO; 
2

En mi caso, el problema era que la función reloadData() no fue llamado desde el hilo principal .

me han cambiado esta colocándolo en un función dispatch_async(), que resolvió el problema:

dispatch_async(dispatch_get_main_queue(), { 
    self.tableView.reloadData() 
}) 

Esperanza esto ayuda a los demás.

Cuestiones relacionadas