Das Storyboard enthält keinen View Controller mit einer Kennung


175

Ich erhalte immer wieder den folgenden Fehler:

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

Dies ist der 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];
}

Ich habe bereits das Set identifierauf das , UIStoryboardaber ich bin immer noch diesen Fehler.

Geben Sie hier die Bildbeschreibung ein



4
Sieht so aus, als hätten Sie die Kennung eines Segues festgelegt, nicht eines View Controllers. Welchen View Controller in diesem Bild möchten Sie präsentieren? Und warum benutzt du nicht einfach einen Segue?
Firoze Lafeer

Bis zu Driving View Controller funktioniert gut .... als wenn ich versuche, TableViewController zu präsentieren, erhalte ich den Fehler ...... wie würden Sie es tun?
Mat

Gehen Sie zu Storyboard, entfernen Sie diese Storyboard-ID und fügen Sie sie erneut hinzu. Sie müssen manchmal Build-Ordner und abgeleitete Daten
bereinigen

Antworten:


244

Nur zum späteren Nachschlagen:

Ich entwickle auf iOS 6 mit Storyboards.

Ich hatte das gleiche Problem, konnte jedoch das Feld "Kennung" im Inspektor nicht finden. Setzen Sie stattdessen einfach das Feld "Storyboard ID" auf den Namen des Bezeichners. Dieses Feld befindet sich im Inspektor auf der Registerkarte "Identitätsinspektor anzeigen".

[Hinweis - Kommentare unten weisen darauf hin, dass einige Personen festgestellt haben, dass sie (auch?) Das Feld "Wiederherstellungs-ID" direkt unter der Storyboard-ID im Inspektor festlegen müssen. Das Klicken auf "Storyboard-ID verwenden" scheint nicht ausreichend zu sein.]

Es gibt ein Bild unten als Referenz: (In diesem Fall habe ich meinen Bezeichner genauso benannt wie meine Klasse) Geben Sie hier die Bildbeschreibung ein


24
vor XCode 4.4 und früher: Kennung; XCode 4.5: Storyboard ID
Ilmiacs

Danke für Ihre Information. Ich hatte Probleme, einen Bezeichner im Storyboard zu finden, der den Erläuterungen in Google folgte, aber ich konnte den Bezeichner in Xcode4.6 nicht finden. Dies ist ein großes Problem für Neulinge. Vielen Dank.
Anfänger

4
Was für mich funktioniert hat, war die Verwendung des ReuseIndentifier. Die Storyboard-ID verursacht weiterhin eine Nullzeigerausnahme.
Droid Chris

Gleicher Fall hier @DroidChris
Ahmed

5
Die
Suche

189

In Xcode 7 - 11 ,

Wenn Sie die Storyboard-IDs ändern und solche Fehler erhalten,

REINIGEN Sie einfach Ihr Projekt ( CMD+ SHIFT+ K)


13
Warum vergesse ich das immer? Es behebt die verrücktesten Probleme. Danke, Ted, dass du mich daran erinnert hast!
AlphaCodaSeven

2
Dieses Problem trat in XCode 7.2 beim Abrufen von einem Repo auf, in dem einem VC im Storyboard eine Kennung zugewiesen wurde. Das Bereinigen des Projekts schien das Problem zu beheben.
Ed George

2
Ich dachte, ich würde den Verstand verlieren ... ein einfacher Abschnitt funktionierte nicht, das war der Trick.
dokun1

2
Ja, es funktioniert !!!! Einige Zeit Bereinigen des Xcode-Projekts wird unerwünschte Verweise auf Projekt entfernen
kiran

3
Ich komme aus Android Studio und Android-Entwicklung. Das ist verrückt, wie viele Hacks ich in XCode und Swift verwenden muss. Ich muss wirklich weinen. Ernsthaft.
Ktamas

43

Fest! In meinem Fall muss nicht nur der Bezeichner im Abschnitt gesetzt werden, in meinem Fall DrivingDetails, sondern auch der Bezeichner in meinem tableViewController muss als DrivingDetails festgelegt werden ... überprüfen Sie mein Bild:

Geben Sie hier die Bildbeschreibung ein

Ich habe auch den Navigationsansichts-Controller entfernt, sodass die beiden Tabellenansichts-Controller jetzt direkt mit einer "Push" -Animation verbunden sind.

***** BEARBEITEN für XCODE 7.0 *****

Sie müssen die Storyboard-ID festlegen (in diesem Fall ist der viewController in einen Navigationscontroller eingebettet:

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

Geben Sie hier die Bildbeschreibung ein


2
Ich habe ein ähnliches Problem wie diese Frage, aber wenn ich zum Attributinspektor gehe, sehe ich nicht 2 Felder wie in Ihrem Screenshot nur ein
Titelfeld

Hast du dir die Antwort oben angesehen? Ich denke ist mehr aktualisiert. Danke
Mat

1
Die Kennung für den Segue hat damit nichts zu tun. Im Storyboard muss nur die Storyboard-ID für den View Controller festgelegt werden.
Jawwad

Möglicherweise verwandt. In iOS7 werden [storyboard instantiateViewControllerWithIdentifier]die Ansichten von Interface Builder im View Controller NICHT instanziiert. aber in iOS6 tat es
William Entriken

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

Hinweis:

  • "StoryboardFileName"ist der Dateiname des Storyboards und nicht die ID des Storyboards!
  • "StoryboardID"ist die ID, die Sie manuell im Identitätsinspektor für dieses Storyboard festgelegt haben (siehe Abbildung unten).

Storyboard-ID

Manchmal glauben die Leute, dass die erste die Storyboard-ID und die zweite der Name der View Controller-Klasse ist. Beachten Sie also den Unterschied.


1
Dies!! Mein Mann, du hast gerade mein 18-Stunden-Rätsel gelöst. Vielen Dank für die kurze Erklärung.
Herr Fevrier

1
Jesus Christus! Danke dafür! .instantiateViewController(withIdentifier: "StoryboardID")sollte umbenannt werden in .instantiateStoryboard(withIdentifier: "StoryboardID")Oder einfach etwas einfacherUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
Roosevelt

16

Identität befindet sich auf der Registerkarte Identitätsinspektor mit dem Namen Storyboard-ID für Xcode 6.3.2 und aktiviert die Option Storyboard-ID verwenden. Geben Sie hier die Bildbeschreibung ein


Das war die ganze Zeit das Problem, das funktionierte an beiden Orten, an denen ich Probleme hatte. Es wird nicht nur der Wert für die Storyboard-ID festgelegt, sondern Sie müssen auch die
Tyler Hack,

"Use Storyboard ID" war das entscheidende Stück, das mir fehlte. Danke dir.
Marcy

9

Hatte gerade dieses Problem, nachdem ich dem Storyboard eine neue VC hinzugefügt hatte, aber nur auf dem Gerät, nicht auf dem Simulator. Es stellte sich heraus, dass es mehrere Storyboard-Lokalisierungen gab - der VC wurde nur dem primären hinzugefügt. Ich habe versucht, die anderen Lokalisierungen zu entfernen (eine davon ist die, die mein iPhone verwendet), hatte aber immer noch den Fehler. Am Ende musste ich die anderen Lokalisierungen mit der neuen VC in jeder von ihnen neu erstellen .


5

Der Compiler zeigt folgenden Fehler an:

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

Hier ist das Objekt des erstellten Storyboards nicht das Haupt-Storyboard, das unsere ViewController enthält. Die Storyboard-Datei, an der wir arbeiten, heißt Main.storyboard . Wir brauchen also eine Referenz des Objekts des Main.storyboards .

Verwenden Sie dazu folgenden Code:

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

Hier storyboardWithNameist der Name der Storyboard-Datei, mit der wir arbeiten, und bundlegibt das Bundle an, in dem sich unser Storyboard befindet (dh mainBundle).


5

Für diejenigen mit dem gleichen Problem wie @Ravi Bhanushali gibt es hier eine Swift 4-Lösung:

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


Dies sollte ein Kommentar zu @ Ravis Antwort hinzugefügt werden.
Sunil

Ich hätte aber nicht den Ruf. Jemand mit genügend Ruf ist mehr als willkommen, dies zu tun
confitz20

4

Ich habe es gefunden ... Klicken Sie auf den View Controller im Storyboard, klicken Sie auf das dritte Symbol von links in den Inspektoren für VC-Attribute - das Symbol, in dem Sie den Anrufnamen auf der Szene festgelegt haben, auf der "Identität" steht - meine war ausgeblendet, ich musste Klicken Sie auf das Wort Identität, auf dem die Storyboard-ID angezeigt wird. Fügen Sie die Kennung aus dem Code hinzu


4

Das Ändern der "Storyboard-ID" im Identitätsinspektor (das dritte Symbol links) sollte funktionieren.

Wenn nicht und Sie sicher sind, dass kein Tippfehler vorliegt, bereinigen Sie das Projekt ("Produkt" -> "Bereinigen" oder einfach Befehl + Umschalt + K).


hat mein Leben gerettet. Vielen Dank. (vor allem der Teil über die Reinigung)
Jay

1

Während Sie die Kennung eingeben, haben Sie nicht den richtigen Ansichts-Controller ausgewählt. Überprüfen Sie den Vorgang nur einmal, und wiederholen Sie den Vorgang noch einmal.


Welchen View Controller soll ich auswählen? Entschuldigung ich bin verwirrt.
Mat

TableViewController * controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "driverDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] valueForKey: @ "name"]; [self.navigationController pushViewController: Controller animiert: JA]; so was?
Mat

Gemäß dem Bild sollte TableViewController so ausgewählt werden, wie Sie es tun, um Details in diesem Controller anzuzeigen.
Iamsult

Schritt für Schritt Erklärung des Storyboards
iamsult

1
Nur eine kleine Anmerkung: Ihre Segue-ID und die View-Controller-ID sind unterschiedlich. Ich wollte nur hervorheben, dass es einige Verwirrung gab, da Sie für beide den gleichen Namen verwenden. Ihre Segue-ID sollte für die Verwendung in prepareForSegue verwendet werden, und Ihre View-Controller-ID dient zum direkten Laden von Ansichten aus Ihrem Storyboard. scott-sherwood.com/?p=219
Scott Sherwood

1

Bei einigen meiner View Controller fehlte der StoryboardIdentifier Attribut .

Vor:

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

Nach dem:

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

0

Ich habe den gleichen Fehler erhalten und konnte diesen beheben, indem ich die folgenden Änderungen in meinem Projekt änderte. Ich habe meinen Klassennamen im Inspektorfenster erwähnt, dann ist das Problem gelöst. Gehe zu-> rechtes Feld dort Identitätsinspektor Im Abschnitt für benutzerdefinierte Klassen

Klasse: Ihr Klassenname (ViewController)

Im Abschnitt Identität Storyboard-ID: Ihre Storyboard-ID (viewController-Name)

Danach klicken Sie dort auf die Option Storyboard-ID verwenden. Damit ist das Problem behoben. Ich hoffe es hilft dir....


0

Verwenden Sie Ihre Kennung (@ "driverDetails") als Storyboard-ID.


0

Es ist sehr einfach, den jeweiligen Ansichts-Controller im Haupt-Storyboard auszuwählen und die Storyboard-ID zu überprüfen, wenn sie derzeit in der ID verwendet wird, um einen Namen zu geben und sie zu verwenden.

hier ist mein firstone die storyboardID let vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") as! tabBarViewController


0

Ich habe alle oben genannten Lösungen ausprobiert und keine hat funktioniert.

Was ich getan habe war:

  • Projekt sauber
  • Abgeleitete Daten löschen
  • Starten Sie Xcode neu
  • Geben Sie die in den vorherigen Antworten gezeigte StoryboardID erneut ein (innerhalb von IB).

Und dann hat es funktioniert. Das Schockierende war, dass ich die Storyboar-ID im Interface Builder eingegeben hatte und sie nach dem erneuten Öffnen von Xcode entfernt / gelöscht wurde.

Hoffe das hilft jemandem.


0

Das Reinigen aller Dinge und das Schließen von Xcode hat das Problem für mich nicht gelöst.

Ich musste den viewController löschen und einen neuen mit neuer Kennung erstellen.


0

Hinweis: Wenn Sie in Ihrem Projekt Cocoapods verwenden, führen Sie diese zuerst auspod deintegrate und ausrm Podfile.lock

Öffnen Sie dann Ihren Projektordner in einem Code-Editor eines Drittanbieters wie VSCode und führen Sie eine globale Suche nach dem ViewController-Namen durch, der den Fehler auslöst.

  1. Benennen / korrigieren Sie alle falschen Namen, die Sie finden.
  2. Alle Änderungen speichern.
  3. Reinigen und bauen Sie Ihr Projekt.

Alles sollte jetzt gut funktionieren.

Dies wird am häufigsten verursacht, wenn Sie Dateien in Xcode umbenennen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.