web-dev-qa-db-fra.com

nib non valide enregistré pour l'identifiant (CELLNAME) - nib doit contenir exactement un objet de niveau supérieur qui doit être une instance UITableViewCell

Désolé pour le titre long, mais je voulais qu'il soit clairement visible à partir d'une recherche Google . De plus, cela diffère de beaucoup d'autres questions similaires ici car il ne spécifie pas un identifiant 'null' mais un identifiant qui existe.

Le problème survient essentiellement lorsque vous essayez de naviguer en utilisant l’une des cellules d’un contrôleur de vue tableau pour passer à une autre vue (quelle que soit cette vue).

La plupart des gens se heurteraient à ce problème après avoir suivi le didacticiel Apple sur la "liste des tâches à effectuer" et espéré que les cellules fonctionnent dans le même mouvement, quel que soit leur objectif. Ce problème est probablement simpliste pour la plupart des gens, mais pour un débutant, c'est assez difficile, cela m'a pris environ 3 heures. 

Fondamentalement, l'erreur est la suivante:

invalid nib registered for identifier (prototypeCell) - nib must contain exactly one top level object which must be a UITableViewCell instance

Où 'prototypeCell' serait ce que votre cellule s'appelle. Il s'agit d'une exception qui se produit immédiatement au lancement de l'application.

38
Cail Demetri

J'ai eu le même problème que ci-dessus, mais je n'utilisais pas de story-boards et le problème est apparu de façon inattendue.

J'ai trouvé que la solution se trouvait dans le fichier de cellules tableview. J'avais ajouté un uibutton, mais il avait été ajouté en dehors des limites de la cellule par erreur. Cela signifiait que c'était presque comme une vue supplémentaire dans uiview. 

Une fois que j'ai trouvé et supprimé cette vue supplémentaire, le problème a disparu immédiatement.

Si vous rencontrez cette erreur, vérifiez dans uitableviewcell les vues et objets supplémentaires ajoutés par erreur.

161
simon_smiley

La réponse de simon_smiley m'a orientée dans la bonne direction, mais des essais et des erreurs supplémentaires étaient nécessaires pour aboutir à la solution suivante:

Le problème ne se pose pas uniquement pour les objets UIView de niveau supérieur supplémentaires, mais également pour les dispositifs de reconnaissance de mouvements [. Veillez donc à ne pas utiliser de logiciels de reconnaissance de mouvements dans votre fichier XIB défaillant, vous pouvez les configurer à la place.

Par exemple, vous pouvez le faire dans awakeFromNib, comme indiqué par vahotm dans les commentaires de réponses acceptés.

20
Dschee

J'ai eu le même problème! Et dans mon cas, la cellule personnalisée était la sous-classe d'UIView par erreur au lieu de UITableViewCell. Donc, remplacer UIView par UITableViewCell a résolu le problème!

7
Annie

Même problème parce que je fais glisser une UITapGestureRecognizer sur les sous-vues de ContentView. Il suffit de l'enlever.

5
William Hu

Le problème est que votre storyboard contient plusieurs cellules portant le même nom. Comme pour une seule vue de table, plusieurs cellules ont le même identifiant. Dans mon cas, j'avais trois cellules qui s'appelaient toutes «prototypeCell».

La solution est en fait assez facile. Pour chaque cellule, nommez-le simplement avec le numéro de cellule à la fin. Ce numéro de cellule doit correspondre ultérieurement à indexPath.row, donc commencez à partir de 0. 

Par exemple:

prototypeCell0
prototypeCell1
prototypeCell2

Ensuite, allez dans la classe qui est responsable du contrôleur, et trouvez la fonction 

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

Puis remplacez le code:

static NSString *CellIdentifier = @"PrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

Avec le code:

static NSString *CellIdentifier = @"ListPrototypeCell";
NSString* num = [NSString stringWithFormat:@"%d", indexPath.row];
NSString* actual = [CellIdentifier stringByAppendingString:num];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:actual forIndexPath:indexPath];

Tout le reste peut rester le même. Ce code obtient essentiellement le numéro de ligne, l'ajoute à la base d'identifiant, puis extrait la cellule de la table à l'aide de cette chaîne. Donc, si sa réponse à un numéro de ligne différent, il retourne une cellule différente.

Juste pour clarifier, ma fonction pour le problème est la suivante:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ListPrototypeCell";
    NSString* num = [NSString stringWithFormat:@"%d", indexPath.row];

    NSString* actual = [CellIdentifier stringByAppendingString:num];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:actual forIndexPath:indexPath];
    cell.textLabel.text = self.content[indexPath.row];

    return cell;
}

Bonne chance!

En outre, ceci est mon premier combo Réponse/Question, donc je n’ai vraiment aucune idée de la façon de l’aborder, alors si j’ai fait quelque chose de mal, dites-le-moi et/ou changez le ...

3
Cail Demetri

Parfois, vous utilisez le storyboard et avez collectionView à l'intérieur ainsi que collectionView. Après cela, vous décidez de simplifier votre Storyboard et de diviser la cellule en une autre plume. Vous créez un nich vide, Ctrl+C à partir du storyboard -> Ctrl+V dans le nib.

Tout semble aller pour le mieux, mais vous aurezApplication terminée en raison de l'exception non interceptée 'NSInternalInconsistencyException', motif: 'nib non valide enregistré pour l'identificateur (PrettyCollectionViewCell) - nib doit contenir exactement un objet de niveau supérieur qui doit être une instance UICollectionReusableView'

Ansver: ne fais pas ça. Après avoir nettoyé la plume et ajouté tous les éléments comme dans Storyboard, cela a été corrigé.

Cela ressemble à un bogue de xCode IB - Version 7.3.1 (7D1014) 

3
WINSergey

Je vais mettre en place ma solution idiote pour le bien des googlers ...

C’était ma propre erreur idiote: lorsque j'ai créé une nouvelle cellule personnalisée pour ma vue tableau, je suis allé dans le répertoire de niveau supérieur de mon projet -> ajouter un nouveau fichier -> et créer un type de fichier vide sous OS X section plutôt que la section iOS .

Espérons que la plupart des gens ont l’autre problème décrit ci-dessus car il est moins embarrassant: P

2
Ryan

Cette erreur est principalement due à des vues supplémentaires ajoutées par erreur. Examinez le fichier .xib et recherchez une vue supplémentaire indésirable ajoutée par erreur. Supprimez cela et cela fonctionnera parfaitement. Vous pouvez rechercher des vues indésirables en voici à quoi cela ressemble

1
2rahulsk

Dans mon cas, J'ai ajouté UITableViewHeaderFooterView sous-classe et XIB dans different cible au lieu de cible réelle.

Assurez-vous qu'il est dans la cible en cours d'exécution.

 enter image description here

1
Zaid Pathan

J'ai eu ce problème, finalement découvert que j'avais créé UITableViewCell Subclass au lieu de CollectionViewCell subclass. c'était le soir et j'étais fatigué, lol. Fixé dans le man.

0
ck8414

J'ai fait glisser la cellule de vue de collection d'un autre projet et je l'ai obtenue.
'nib non valide enregistré pour identifier (cellule) - nib doit contenir exactement un objet de niveau supérieur qui doit être une instance UICollectionReusableView'.
Ensuite, j'ai comparé la cellule de la vue de collection créée à partir de moi et trouvé une vue réutilisable manquante. J'espère que cette aide.
 enter image description here

0
user1039695

C'était une erreur stupide de mon côté et j'avais deux cellules tableview qui ont causé cette erreur. Suppression de l'autre "cellule de vue de tableau" qui a résolu le problème.

0
Stephen Selvaraj