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


Tapis
la source
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

khaliq
la source
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)

Ted
la source
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

Tapis
la source
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.

Rafael
la source
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

BeyazBaron
la source
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.

Hari Karam Singh
la source
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).

Ravi Bhanushali
la source
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)

confitz20
la source
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

Jon
la source
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).

aychen0110
la source
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.

iamsult
la source
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">
Andy
la source
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 ...

Narasimha Nallamsetty
la source
0

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

Priyam
la source
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

Saba Zehra
la source
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.

Darkwonder
la source
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.

user3722523
la source
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.

Arjun Shukla
la source
-1

XCODE DRAG N DROP PANE EST GONE !!!

entrez la description de l'image ici entrez la description de l'image ici

Monsieur Heelis
la source