Uisearchdisplaycontroller et UITableView prototype cell crash
j'ai un UIViewController
le programme d'installation dans un storyboard avec un tableview
et UISearchDisplayController
.
j'essaie d'utiliser une cellule prototype personnalisée de self.tableview (qui est connecté à tableview principal dans le storyboard). Il fonctionne très bien si self.tableview
avait retourné au moins 1 cellule quand je charge ma vue, mais si self.tableview
n'a pas de charge d'une cellule (comme il n'y a pas de données), et je charge le UISearchBar
et de recherche, le cellForRowAtIndexPath:
méthode pannes:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomSearchCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
-(void)configureCell:(CustomSearchCell *)cell atIndexPath:(NSIndexPath *)indexPath {
User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.nameLabel.text = user.username;
}
les Erreurs suivantes:
*** Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0x9ef3d00> {length = 2, path = 0 - 0})
Mon fetchedResultsController semble avoir des données (section 1, 2 lignes) au point de la méthode ci-dessus est appelée. Il se bloque sur l' dequeueReusableCellWithIdentifier
ligne.
des conseils / idées? Il devrait détruire la cellule prototype de self.tableview
, mais ma conjecture est que il n'y avait rien créé dans self.tableview
donc c'est la cause?
4 réponses
UISearchDisplayController gère son propre UITableView (table filtrée), en plus d'avoir votre table primaire. La cellule identifiant dans la table filtrée ne correspond pas à votre table primaire. Vous voulez aussi récupérer la cellule non pas par indexPath car les deux tables peuvent être très différentes les unes des autres en ce qui concerne le nombre de lignes, etc.
Donc au lieu de faire ceci:
UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
au lieu de faire ceci:
UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
j'ai résolu cela en dupliquant la cellule prototype dans un nouveau xib:
Dans le viewDidLoad:
[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CustomSearchCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomSearchCell"];
et mis à jour cellForRowAtIndexPath pour utiliser tableview de la méthode et non le soi original.tableview:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
C'est un vieux sujet, mais si quelqu'un s'exécute dans le même problème, pour moi, c'était lié à avoir cette ligne dans le viewDidLoad
self.tableView.estimatedRowHeight = 80;
et en même temps la mise en œuvre de la méthode heightForRowAtIndexPath delegate avec des hauteurs variables dans des conditions différentes
if (indexPath.row == 0) {
return 44 + cellTopSpacing;
} else {
return 44;
}
Supprimer la ligne estimée hauteur résolu.
si vous utilisez à UISearchDisplayController dans le methode celForRowAtIndexPath, vous devez utiliser le paramètre methode de tableView et non le pointeur de maintien du controller.
essayer avec ce code
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];