web-dev-qa-db-fra.com

Aucun chemin d'index pour la cellule de table en cours de réutilisation

Cela a commencé à se produire à l'improviste. Toutes les idées: Code:

CUSTOMCLASSNAME (J'ai remplacé le nom actuel de la classe car il contient le nom du client.)

Initialiser ma table Voir:

[self.tableView registerClass:[CUSTOMCLASSNAME class] forCellReuseIdentifier:[self reuseIdentifier]];

Dans la cellule pour la ligne:

Bonjour, le titre est en cours d’impression dans la console. Voici mon CellForRow:

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

    AVTCheckListTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self reuseIdentifier] forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)configureCell:(AVTCheckListTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    ChecklistGroup *group = [self.checklistFetchedResultsController.fetchedObjects objectAtIndex:indexPath.section];

    ChecklistItem *item = [self getChecklistItemForIndexPath:indexPath];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [[cell cellTextView] setAttributedText:[[item checked] boolValue] ? [[NSAttributedString alloc] initWithString:[item name] attributes:@{ NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle) } ] : [[NSAttributedString alloc] initWithString:[item name]]];
    [[cell cellTextView] setUserInteractionEnabled:[[group isUserDefined] boolValue]];
    [[cell cellTextView] setTag:indexPath.row];
    [[cell cellTextView] setDelegate:self];
    [[cell tickImage] setHidden:![[item checked] boolValue]];
}

//Method that returns re-use:

- (NSString *) reuseIdentifier {
    return @"CheckListTableView";
}
16
CW0007007

J'ai travaillé cela après quelques jours. Dans ma cellule personnalisée, j'avais un textView. Lorsque je l'ajoutais à contentView, je faisais ceci:

[self.cellTextView setClearsOnInsertion:YES];

C'était la cause du problème; Si quelqu'un d'autre a un problème similaire. 

Bonne codage :-)

1
CW0007007

Renvoie [cell contentView] au lieu de cell à partir de tableView:viewForHeaderInSection:

EDIT: / Cela a en quelque sorte conduit à des plantages sur des gestes à pression longue sur les boutons de l'interface utilisateur. Pour résoudre ce problème, j'ai abandonné et utilisé une autre section avec un seul élément comme faux en-tête de section.

59
TalkLittle

J'ai trouvé cet avertissement lors de ma mise en œuvre viewForHeaderInSection.

Voici ma solution dans Swift 2.x :

let headerView = self.tableView.dequeueReusableCellWithIdentifier("MyCell") as! MyCell
let containerView = UIView(frame:headerView.frame)
headerView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
headerView.myLabel.text = "section title 1"
containerView.addSubview(headerView)
return containerView

Ceci est la Swift 3 version:

let headerView = self.tableView.dequeueReusableCell(withIdentifier: "MyCell") as! MyCell
let containerView = UIView(frame:headerView.frame)
headerView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
headerView.myLabel.text = "section title 1"
containerView.addSubview(headerView)
return containerView
10

Je viens de retrouver la cause de ce message d'erreur.

UITableViewCell était utilisé comme une vue normale. Par conséquent, sa 'indexPath n'a pas été définie. Dans notre cas, l'un était renvoyé par viewForHeaderInSection:

J'espère que cela t'aides.

Chris

7
chrisoneiota

Dans mon cas, cette erreur n’a été présentée que sur iPhone (pas sur iPad) car j’avais placé [self.tableView beginUpdates]; et plus tard [self.tableView endUpdates]; dans [UIView transitionWithView:duration:options:animations:compeletion];. Pour résoudre ce problème, je viens de supprimer les mises à jour de début/fin, car je préférais une animation en fondu au lieu de fondus en animant les changements de hauteur de cellule.

2
Jordan H

Si vous utilisez la cellule pour l'en-tête de section de la vue d'en-tête, vous devez la placer dans le conteneur, puis renvoyer la vue du conteneur pour éviter "qu'aucun chemin d'index pour la cellule de tableau ne soit réutilisé". L'exemple de code ci-dessous.

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    CustomerCellHeader *headerViewCell = [tableView dequeueReusableCellWithIdentifier:kCustomerCellHeaderIdentifier];
    headerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [headerView addSubview:headerViewCell];
    return headerView;
}
1
Kit

En fait, j’ai passé presque toute la journée à essayer de résoudre ce problème. J'espère donc que cette explication alternative fera gagner du temps à quelqu'un d'autre.

J'ai eu une tableview qui donnait ce message parfois, lors du chargement. Cela a été causé par les notifications KVO pour le déclenchement d'objets Core Data pendant le chargement de la vue. (En observant un changement, mon contrôleur a essayé d'appeler reloadData sur la vue de table en question. Corrigé en n'observant pas les objets jusqu'à ce que le chargement de la vue soit terminé (auparavant, je commençais à observer l'objet après l'attribution via l'accesseur)

TLDR: Vérifiez si vous essayez de recharger vos données à partir de quelque chose d'autre que le thread principal.

ENCORE MIEUX:

C'est un problème que vous ne rencontrerez pas si (comme je l'ai découvert vous devriez le faire) utilisez des contextes d'objet gérés par des enfants et ne fusionnez que les modifications dans votre MOC principal sur le thread principal à des moments sensibles.

1
Jonathan Zhan

Dans mon cas (assez stupide), j'ai utilisé la syntaxe if let dans cellForRowAt comme ceci:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "carCell", for:
    indexPath) as? carTableViewCell {
        // Did some stuff here
        return carTableViewCell()
    else {
        return carTableViewCell()    
    }
}

Comme vous pouvez le constater, j’ai renvoyé i carTableViewCell () générique, et c’est ce qui m’a donné cette erreur ignoble ... J'espère que cela aidera un jour quelqu'un haha ​​(:

Bon codage!

0
Gal Shahar

J'ai reçu la même erreur, mais pour une raison différente. 

J'avais un UITableViewCell personnalisé qui définissait l'un des UITextField pour qu'il devienne FirstFrpondeur. L'erreur s'est produite lorsque plusieurs instances de cette cellule personnalisée ont été renvoyées. 

Je règle simplement uniquement la première instance de la cellule personnalisée à devenirFirstResponder et le problème est résolu. 

0
GrindItOut

J'ai eu des problèmes pour renvoyer une UITableViewCell dans tableView:viewForHeaderInSection, mais renvoyer [cell contentView] provoquait le blocage de tous les boutons de la cellule, et définir un affichage de vue autour de la cellule semblait inutile. Au lieu de cela, j'ai changé ma classe UITableViewCell en UITableViewHeaderFooterView et cela a fonctionné à merveille!

Si vous avez ce problème:

La définition de la couleur d'arrière-plan sur UITableViewHeaderFooterView est obsolète. Veuillez utiliser contentView.backgroundColor à la place.

Rappelez-vous simplement de changer la couleur d'arrière-plan de votre plume en valeur par défaut.

0
Ben Chen

J'ai eu le même problème. Ce message apparaît lorsque je fais défiler et que les cellules sont réutilisées. 

Beaucoup de réponses ont parlé de viewForHeaderInSection mais je ne les ai pas utilisées. Au cas où quelqu'un aurait le même problème, je vous présente ma solution.

J'ai ajouté l'observateur aux champs de texte à l'intérieur de chaque cellule. Je me demande s'il s'agit de l'observateur à l'origine de ce problème, car je n'ai pas supprimé les observateurs lorsqu'une cellule est recyclée.

J'ai donc retiré l'observateur lorsqu'une cellule est déinitée.

Il semble que le problème est résolu. Je ne peux pas garantir.

0
Clarke Xun Gong

Cela m'a aidé dans Swift 2.1 

  func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
            let headerCell:SBCollapsableTableViewHeader = self.friendsInfoTableView.dequeueReusableCellWithIdentifier("HeaderCell") as! SBCollapsableTableViewHeader
            let containerView = UIView(frame:headerCell.frame)
            headerCell.delegate = self
            headerCell.titleLabel.font = UIFont.boldSystemFontOfSize(15)
            headerCell.titleLabel.text = "\(self.ObjectArray[section].sectioName)"
            headerCell.collapsedIndicatorLabel.text = collapsed ? "+" : "-"
            headerCell.tag = section
            headerCell.backgroundColor =  UIColor(red:72/255,green:141/255,blue:200/255,alpha:0.9)
            containerView.addSubview(headerCell)
            return containerView
    }
0
Jitendra