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?

20
demandé sur Rishil P. 2013-09-01 20:10:17

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];
60
répondu raw3d 2013-12-18 11:48:54

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;
}
7
répondu mootymoots 2013-09-01 16:46:12

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.

0
répondu Geo 2017-04-18 09:16:29

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];
-1
répondu tdelepine 2013-09-01 16:25:50