Le storyboard ne contient pas de contrôleur de vue avec identifiant


175

J'obtiens l'erreur suivante:

Storyboard (<UIStoryboard: 0x7ebdd20>) doesn't contain a view controller with identifier 'drivingDetails'

Voici le code:

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   UIViewController *controller =  [self.storyboard instantiateViewControllerWithIdentifier:@"drivingDetails"];
   controller.title = [[dao libraryItemAtIndex:indexPath.row] valueForKey:@"name"];
   [self.navigationController pushViewController:controller animated:YES];
}

J'ai déjà mis le identifiersur le UIStoryboardmais j'obtiens toujours cette erreur.

entrez la description de l'image ici



4
Il semble que vous ayez défini l'identifiant d'un segment, pas d'un contrôleur de vue. Quel contrôleur de vue dans cette image essayez-vous de présenter? Et pourquoi n'utilisez-vous pas simplement un segue?
Firoze Lafeer

Jusqu'au contrôleur de mode conduite fonctionne bien .... que lorsque j'essaye de présenter TableViewController j'obtiens l'erreur ...... comment feriez-vous?
Mat

Accédez à Storyboard, supprimez cet ID de Storyboard et ajoutez à nouveau. Vous devez parfois nettoyer le dossier de construction et les données dérivées
onmyway133

Réponses:


244

Juste pour référence future:

Je développe sur iOS 6 à l'aide de Storyboards.

J'avais le même problème, mais je n'ai pas pu trouver le champ «Identifiant» dans l'inspecteur. Au lieu de cela, définissez simplement le champ nommé "ID du Storyboard" sur ce que vous nommeriez l'identifiant. Ce champ se trouve sous l'onglet "Afficher l'inspecteur d'identité" de l'inspecteur.

[Remarque - les commentaires ci-dessous indiquent que certaines personnes ont trouvé qu'elles devaient (également?) Définir le champ "ID de restauration" juste en dessous de l'ID du storyboard dans l'inspecteur. Cliquer sur "Utiliser l'identifiant du storyboard" ne semble pas suffisant.]

Il y a une image ci-dessous pour référence: (dans cet exemple, j'ai nommé mon identifiant de la même manière que ma classe) entrez la description de l'image ici


24
pré XCode 4.4 et versions antérieures: identifiant; XCode 4.5: ID du storyboard
ilmiacs

Merci pour vos informations. J'avais du mal à trouver l'identifiant dans le storyboard en suivant les explications de google, mais je n'ai pas pu trouver l'identifiant dans Xcode4.6. c'est un gros problème pour les débutants. Merci.
débutants

4
Ce qui a fonctionné pour moi était d'utiliser le ReuseIndentifier. L'ID de storyboard provoque toujours une exception de pointeur nul.
Droid Chris

Même cas ici @DroidChris
Ahmed

5
vérifier "Utiliser l'identifiant du storyboard" m'a rendu heureux
preetam

189

Dans Xcode 7-11 ,

lorsque vous modifiez les identifiants du storyboard et que vous obtenez des erreurs comme celle-ci,

NETTOYEZ simplement votre projet ( CMD+ SHIFT+ K)


13
Pourquoi est-ce que j'oublie toujours de faire ça? Il résout les problèmes les plus fous. Merci, Ted, de me l'avoir rappelé!
AlphaCodaSeven

2
Ce problème est survenu dans XCode 7.2 lors de l'extraction d'un dépôt dans lequel un VC dans le storyboard avait reçu un identifiant. Le nettoyage du projet a semblé résoudre le problème.
Ed George

2
Je pensais que je perdais la tête ... une simple séquence ne fonctionnait pas, cela a fait l'affaire.
dokun1

2
Oui ça marche !!!! quelque temps, le nettoyage du projet xcode supprimera les références indésirables au projet
kiran

3
Je viens du développement Android Studio et Android. C'est fou le nombre de hacks que je dois utiliser dans XCode et Swift. Je dois vraiment pleurer. Sérieusement.
ktamas

43

Fixé! Non seulement l'identifiant dans la séquence doit être défini, dans mon cas DrivingDetails, mais également l'identifiant dans ma tableViewController doit être défini comme DrivingDetails ... vérifiez mon image:

entrez la description de l'image ici

J'ai également supprimé le contrôleur de vue de navigation, donc maintenant les 2 contrôleurs de vue de table sont connectés directement avec une animation "push".

***** EDIT pour XCODE 7.0 *****

vous devez définir le storyboardId (dans ce cas, le viewController est intégré dans un contrôleur de navigation:

let lastMinVc  = mainStoryBoard.instantiateViewControllerWithIdentifier("lastMinuteNavController") as! UINavigationController

entrez la description de l'image ici


2
Je rencontre un problème similaire à cette question, mais lorsque je vais à l'inspecteur d'attributs, je ne vois pas 2 champs comme dans votre capture d'écran, seulement un champ Titre, pas de champ d'identifiant
Anon957

avez-vous regardé la réponse ci-dessus? Je pense que c'est plus mis à jour. Merci
Mat

1
L'identifiant de la segue n'a rien à voir avec cela. Seul l'ID du storyboard du contrôleur de vue doit être défini dans le storyboard.
Jawwad

Peut-être lié. Dans iOS7, n'instancie [storyboard instantiateViewControllerWithIdentifier]PAS les vues depuis Interface Builder à l'intérieur du contrôleur de vue; mais dans iOS6, il l'a fait
William Entriken

30
let storyboard = UIStoryboard(name: "StoryboardFileName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "StoryboardID")
self.present(controller, animated: true, completion: nil)

Remarque:

  • "StoryboardFileName"est le nom de fichier du storyboard et non l'ID du storyboard!
  • "StoryboardID"est l'ID que vous avez défini manuellement dans l'inspecteur d'identité pour ce storyboard (voir capture d'écran ci-dessous).

ID du storyboard

Parfois, les gens croient que le premier est l'ID du Storyboard et le second le nom de la classe View Controller, alors notez la différence.


1
Ce!! Mon homme, vous venez de résoudre mon mystère de 18 heures. Merci pour l'explication concise.
mrfevrier

1
Jésus Christ! Merci pour cela! .instantiateViewController(withIdentifier: "StoryboardID")devrait être renommé en .instantiateStoryboard(withIdentifier: "StoryboardID")Ou juste quelque chose de plus simpleUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
roosevelt

16

Identité située dans l'onglet Inspecteur d'identité nommé ID de Storyboard pour Xcode 6.3.2 et cochée l'option Utiliser l'ID de Storyboard. entrez la description de l'image ici


C'était le problème depuis le début, cela fonctionnait dans les deux endroits où j'avais des problèmes. Ce n'est pas seulement la valeur de l'ID Storyboard qui est définie, vous devez vérifier le 'Use Storyboard ID'
Tyler Hack

"Utiliser l'identifiant du Storyboard" était l'élément essentiel qui me manquait. Je vous remercie.
Marcy

9

J'ai juste eu ce problème après avoir ajouté un nouveau VC au storyboard mais uniquement sur l'appareil, pas sur le simulateur. Il s'avère que c'était dû à plusieurs localisations de storyboard - le VC n'a été ajouté qu'au principal. J'ai essayé de supprimer les autres localisations (dont l'une est celle que mon iPhone utilise) mais j'ai toujours l'erreur. En fin de compte, j'ai dû recréer les autres localisations avec le nouveau VC dans chacune d'elles.


5

Le compilateur affiche l'erreur suivante:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Storyboard (<UIStoryboard: 0x7fedf2d5c9a0>) doesn't contain a 
ViewController with identifier 'SBAddEmployeeVC''

Ici, l'objet du storyboard créé n'est pas le storyboard principal qui contient nos ViewControllers. Le fichier de storyboard sur lequel nous travaillons est nommé Main.storyboard . Nous devons donc avoir la référence de l'objet du Main.storyboard .

Utilisez le code suivant pour cela:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

Voici storyboardWithNamele nom du fichier de storyboard avec bundlelequel nous travaillons et spécifie le bundle dans lequel se trouve notre storyboard (ie mainBundle).


5

Pour ceux qui ont le même problème que @Ravi Bhanushali, voici une solution Swift 4:

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)


Cela devrait être ajouté un commentaire sur la réponse de @Ravi.
Sunil

J'aurais mais je n'ai pas la réputation. Quelqu'un avec suffisamment de réputation est plus que bienvenu pour le faire
confitz20

4

Je l'ai trouvé ... cliquez sur le contrôleur de vue dans le storyboard, cliquez sur la troisième icône à partir de la gauche sur les inspecteurs d'attributs vc - celui où vous définissez le nom de l'appel sur ce scereen il dit `` identité '' - le mien était caché, je devais cliquez sur le mot identité, il affiche ensuite storyboardID - ajoutez l'identifiant du code, c'est fait


4

La modification de "Storyboard ID" dans l'inspecteur d'identité (la troisième icône à gauche) devrait fonctionner.

Sinon et vous êtes sûr qu'il n'y a pas de faute de frappe, essayez de nettoyer le projet ("Produit" -> "Nettoyer", ou simplement commande + Maj + K).


sauvé ma vie. Merci. (en particulier la partie sur le nettoyage)
Jay

1

Lorsque vous entrez l'identifiant, vous n'avez pas sélectionné le contrôleur de vue approprié, vérifiez simplement une fois si vous avez terminé, répétez la procédure une fois de plus.


quel contrôleur de vue dois-je sélectionner? désolé, je suis confus.
Mat

TableViewController * controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "drivingDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] valueForKey: @ "nom"]; [self.navigationController pushViewController: contrôleur animé: OUI]; comme ça?
Mat

Selon l'image, TableViewController doit être sélectionné comme vous le faites pour afficher les détails dans ce contrôleur.
iamsult

Explication étape par étape du story-board donné à raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1
iamsult

1
Juste un petit mot, votre identifiant de segue et votre identifiant de contrôleur de vue sont différents. Je voulais juste souligner qu'en cas de confusion, vous utilisez le même nom pour les deux. Votre identifiant de segue doit être utilisé dans prepareForSegue et votre identifiant de contrôleur de vue sert à charger directement les vues à partir de votre storyboard. scott-sherwood.com/?p=219
Scott Sherwood

1

Quelques-uns de mes contrôleurs de vue n'avaient pas l' attribut storyboardIdentifier .

Avant:

<viewController
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

Après:

<viewController
    storyboardIdentifier="YourViewControllerName"   <----
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

0

J'ai eu la même erreur et je pourrais résoudre ce problème en modifiant les modifications suivantes dans mon projet. J'ai mentionné le nom de ma classe dans le panneau de l'inspecteur, puis le problème est résolu. Allez dans le panneau de droite Inspecteur d'identité dans la section de classe personnalisée

class: votre nom de classe (ViewController)

Dans la section Identité ID de storyboard: votre ID de storyboard (viewController Name)

Après cela, cliquez sur l'option Utiliser l'ID du storyboard là-bas. Le problème est terminé. J'espère que cela vous aidera ...


0

Utilisez votre identifiant (@ "drivingDetails") comme identifiant du storyboard.


0

il est très simple de sélectionner le contrôleur de vue respectif dans le storyboard principal et de vérifier le storyboardID si son utilisation actuelle dans l'identidier de donner un nom et de l'utiliser.

ici mon premier est le storyboardID let vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") as! tabBarViewController


0

J'ai essayé toutes les solutions ci-dessus et aucune n'a fonctionné.

Ce que j'ai fait était:

  • Projet propre
  • Supprimer les données dérivées
  • Redémarrez Xcode
  • Entrez à nouveau le StoryboardID indiqué dans les réponses précédentes (dans IB).

Et puis ça a marché. Ce qui est choquant, c'est que j'avais entré l'ID Storyboar dans le générateur d'interface et qu'il a été supprimé / supprimé après avoir ouvert à nouveau Xcode.

J'espère que cela aide quelqu'un.


0

Nettoyer tout et fermer Xcode ne résout pas le problème pour moi.

J'ai dû supprimer le viewController et en créer un nouveau avec un nouvel identifiant.


0

Remarque: si vous utilisez des cocoapodes dans votre projet, exécutez d'abord pod deintegrateetrm Podfile.lock

Ensuite, ouvrez votre dossier de projet dans n'importe quel éditeur de code tiers tel que VSCode et effectuez une recherche globale pour le nom ViewController générant l'erreur.

  1. Renommez / corrigez les mauvais noms que vous trouvez.
  2. Enregistrer toutes les modifications.
  3. Nettoyez et construisez votre projet.

Tout devrait bien fonctionner maintenant.

Cela se produit le plus souvent lorsque vous renommez des fichiers à partir de Xcode.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.