Storyboard nie zawiera kontrolera widoku z identyfikatorem


175

Ciągle otrzymuję następujący błąd:

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

To jest kod:

- (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];
}

I już ustawić identifierna UIStoryboardale ja wciąż otrzymuję ten błąd.

wprowadź opis obrazu tutaj



4
Wygląda na to, że ustawiłeś identyfikator płynności, a nie kontroler widoku. Który kontroler widoku na tym obrazku próbujesz przedstawić? A dlaczego nie używasz po prostu segue?
Firoze Lafeer

Aż do kontrolera widoku z perspektywy kierowcy działa dobrze .... niż kiedy próbuję przedstawić TableViewController, pojawia się błąd ...... jak byś to zrobił?
Mat

Przejdź do Storyboard, usuń ten identyfikator Storyboard i dodaj ponownie. Czasami trzeba wyczyścić folder kompilacji i dane pochodne
onmyway133

Odpowiedzi:


244

Tylko w celach informacyjnych:

Tworzę na iOS 6 przy użyciu Storyboards.

Miałem ten sam problem, ale nie mogłem znaleźć pola „Identyfikator” w inspektorze. Zamiast tego po prostu ustaw pole o nazwie „Identyfikator scenorysu” na taką, jaką nazwałbyś Identyfikatorem. To pole można znaleźć w zakładce „Pokaż inspektora tożsamości” w Inspektorze.

[Uwaga - poniższe komentarze wskazują, że niektóre osoby odkryły, że muszą (również?) Ustawić pole „Identyfikator przywracania” tuż pod identyfikatorem serii ujęć w inspektorze. Kliknięcie „Użyj identyfikatora scenorysu” wydaje się nie wystarczać.]

Poniżej znajduje się obraz jako odniesienie: (w tym przypadku nazwałem swój identyfikator tak samo jak moja klasa) wprowadź opis obrazu tutaj


24
pre XCode 4.4 i wcześniejsze: Identyfikator; XCode 4.5: Storyboard ID
ilmiacs

Dziękuję za informację. Miałem kłopoty ze znalezieniem identyfikatora w scenorysie po wyjaśnieniach w Google, ale nie mogłem znaleźć identyfikatora w Xcode4.6. to duży problem dla początkujących. dzięki.
początkujący

4
To, co zadziałało, to użycie ReuseIndentifier. Identyfikator scenorysu nadal powoduje wyjątek wskaźnika o wartości null.
Droid Chris

Taki sam przypadek tutaj @DroidChris
Ahmed

5
sprawdź, czy „Use Storyboard ID” sprawiło, że byłem szczęśliwy
preetam

189

W Xcode 7-11 ,

kiedy zmieniasz identyfikatory scenorysu i otrzymujesz takie błędy,

po prostu Wyczyść swój projekt ( CMD+ SHIFT+ K)


13
Dlaczego zawsze o tym zapominam? Rozwiązuje najbardziej szalone problemy. Dzięki, Ted, za przypomnienie mi!
AlphaCodaSeven

2
Ten problem wystąpił w XCode 7.2 podczas pobierania z repozytorium, w którym VC w scenorysie został przypisany identyfikator. Wydawało się, że czyszczenie projektu rozwiązało problem.
Ed George,

2
Myślałem, że tracę zmysły ... prosta ścieżka nie działała, to załatwiło sprawę.
dokun1

2
Tak, to działa !!!! jakiś czas Czyszczenie projektu xcode usunie niechciane odniesienia do projektu
kiran

3
Pochodzę z Android Studio i programowania na Androida. To szalone, ile hacków muszę użyć w XCode i Swift. Naprawdę muszę płakać. Poważnie.
ktamas

43

Naprawiony! Nie tylko identyfikator w segue musi być ustawiony, w moim przypadku DrivingDetails, ale także identyfikator w moim tableViewController musi być ustawiony jako DrivingDetails ... sprawdź moje zdjęcie:

wprowadź opis obrazu tutaj

Usunąłem również kontroler widoku nawigacji, więc teraz dwa kontrolery widoku tabeli są połączone bezpośrednio z animacją „wypychania”.

***** EDYCJA dla XCODE 7.0 *****

musisz ustawić storyboardId (w tym przypadku viewController jest osadzony w kontrolerze nawigacji:

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

wprowadź opis obrazu tutaj


2
Mam podobny problem jak to pytanie, ale kiedy idę do inspektora atrybutów, nie widzę 2 pól, tak jak na twoim
zrzucie

czy spojrzałeś na powyższą odpowiedź? Myślę, że jest bardziej zaktualizowany. Dzięki
Mat

1
Identyfikator płynności nie ma z tym nic wspólnego. W serii ujęć należy ustawić tylko identyfikator serii ujęć dla kontrolera widoku.
Jawwad

Prawdopodobnie powiązane. W iOS7 [storyboard instantiateViewControllerWithIdentifier]NIE tworzy się instancji widoków z Interface Builder wewnątrz kontrolera widoku; ale w iOS6 tak się stało
William Entriken

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

Uwaga:

  • "StoryboardFileName"jest nazwą pliku serii ujęć, a nie identyfikatorem serii ujęć!
  • "StoryboardID"to identyfikator, który ręcznie ustawiłeś w inspektorze tożsamości dla tego scenorysu (patrz zrzut ekranu poniżej).

Identyfikator scenorysu

Czasami ludzie uważają, że pierwszy z nich to identyfikator scenorysu, a drugi nazwa klasy kontrolera widoku, więc zwróć uwagę na różnicę.


1
To!! Mój człowieku, właśnie rozwiązałeś moją 18-godzinną zagadkę. Dziękuję za zwięzłe wyjaśnienie.
mrfevrier

1
Jezus Chrystus! Dzięki za to! .instantiateViewController(withIdentifier: "StoryboardID")powinien zostać zmieniony na .instantiateStoryboard(withIdentifier: "StoryboardID")Lub po prostu coś prostszegoUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
roosevelt

16

Tożsamość znajduje się na karcie Identity Inspector o nazwie Storyboard ID dla Xcode 6.3.2 i zaznaczono opcję Use Storyboard ID. wprowadź opis obrazu tutaj


To był problem przez cały czas, działał w obu miejscach, w których miałem problemy. Nie chodzi tylko o ustawianie wartości identyfikatora scenorysu, musisz sprawdzić `` Użyj identyfikatora scenorysu ''
Tyler Hack

„Użyj Storyboard ID” było dla mnie istotnym elementem, którego brakowało. Dziękuję Ci.
Marcy

9

Po prostu miałem ten problem po dodaniu nowego VC do storyboardu, ale tylko na urządzeniu, a nie na symulatorze. Okazuje się, że wynikało to z posiadania wielu lokalizacji scenorysów - VC został dodany tylko do pierwotnego. Próbowałem usunąć inne lokalizacje (z których jedna jest tą, której używa mój iPhone), ale nadal występował błąd. W końcu musiałem odtworzyć inne lokalizacje z nowym VC w każdej z nich.


5

Kompilator wyświetla następujący błąd:

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

W tym przypadku obiekt utworzonego storyboardu nie jest główną planszą, która zawiera nasze ViewControllers. Jako plik storyboardu, nad którym pracujemy, nosi nazwę Main.storyboard . Więc musimy mieć odniesienie do obiektu Main.storyboard .

Użyj do tego następującego kodu:

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

Oto storyboardWithNamenazwa pliku storyboardu, z którym pracujemy ibundle określa pakiet, w którym znajduje się nasz storyboard (tj mainBundle.).


5

Dla tych, którzy mają ten sam problem, co @Ravi Bhanushali, oto rozwiązanie Swift 4:

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


Należy dodać komentarz do odpowiedzi @Ravi.
Sunil

Miałbym, ale nie mam reputacji. Ktoś o wystarczającej reputacji jest więcej niż mile widziany
confitz20

4

Znalazłem to ... kliknij kontroler widoku w scenorysie, kliknij trzecią ikonę od lewej na inspektorach atrybutów vc - ten, w którym ustawiłeś nazwę połączenia na tym ekranie, mówi `` tożsamość '' - mój był ukryty, musiałem kliknij słowo tożsamość, a następnie wyświetli się storyboardID - dodaj identyfikator z kodu, gotowe


4

Modyfikacja „Storyboard ID” w inspektorze tożsamości (trzecia ikona po lewej) powinna działać.

Jeśli nie i jesteś pewien, że nie ma literówki, spróbuj wyczyścić projekt („Produkt” -> „Wyczyść” lub po prostu polecenie + Shift + K).


uratował mi życie. dzięki. (zwłaszcza część dotycząca sprzątania)
Jay

1

Podczas wpisywania identyfikatora u nie wybrałeś odpowiedniego kontrolera widoku, po prostu sprawdź raz, czy skończył, powtórz procedurę jeszcze raz.


który kontroler widoku mam wybrać? przepraszam, jestem zdezorientowany.
Mat

TableViewController * controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "drivingDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] valueForKey: @ "name"]; [self.navigationController pushViewController: kontroler animowany: TAK]; lubię to?
Mat

Zgodnie z obrazem, należy wybrać TableViewController, tak jak robisz, aby wyświetlić szczegóły w tym kontrolerze.
iamsult

Opis tablicy scenariuszy krok po kroku podanej raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1
iamsult

1
Zwróć uwagę, że twój identyfikator płynności i identyfikator kontrolera widoku są różne. Chciałem tylko podkreślić, że było pewne zamieszanie, ponieważ używasz tej samej nazwy dla obu. Twój identyfikator płynności powinien być używany w przygotowaniuForSegue, a identyfikator kontrolera widoku służy do bezpośredniego ładowania widoków z serii ujęć. scott-sherwood.com/?p=219
Scott Sherwood,

1

Niektórym z moich kontrolerów widoku brakowało identyfikatora storyboardu atrybutu .

Przed:

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

Po:

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

0

Wystąpił ten sam błąd i mogłem to naprawić, zmieniając następujące zmiany w moim projekcie. Podałem nazwę klasy w panelu inspektora, a problem został rozwiązany. Idź do-> prawy panel tam Inspektor tożsamości W sekcji klasy niestandardowej

class: nazwa twojej klasy (ViewController)

W sekcji Identity identyfikator storyboardu: identyfikator serii ujęć (nazwa kontrolera widoku)

Po tym kliknij opcję Użyj identyfikatora scenorysu tam, to znaczy, że problem został rozwiązany. Mam nadzieję, że ci to pomoże ....


0

Użyj swojego identyfikatora (@ "drivingDetails") jako identyfikatora scenorysu.


0

to jest bardzo proste, wybierz odpowiedni kontroler widoku w głównej planszy scenariuszy i sprawdź StoryboardID, jeśli jest obecny, użyj go w identyfikatorze, podaj nazwę i użyj go.

tutaj moim pierwszym jest storyboardID let vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") as! tabBarViewController


0

Wypróbowałem wszystkie powyższe rozwiązania i żadne nie działało.

To co zrobiłem to:

  • Projekt czysty
  • Usuń dane pochodne
  • Uruchom ponownie Xcode
  • Ponownie wprowadź StoryboardID pokazany w poprzednich odpowiedziach (wewnątrz IB).

I wtedy zadziałało. Szokujące było to, że wprowadziłem Storyboar ID w konstruktorze interfejsów i został on usunięty / usunięty po ponownym otwarciu Xcode.

Mam nadzieję, że to komuś pomoże.


0

Czyszczenie wszystkich rzeczy i zamknięcie Xcode nie rozwiązało problemu.

Musiałem usunąć viewController i utworzyć nowy z nowym identyfikatorem.


0

Uwaga: Jeśli używasz cocoapods w swoim projekcie, najpierw uruchom pod deintegrateirm Podfile.lock

Następnie otwórz folder projektu w dowolnym edytorze kodu innej firmy, takim jak VSCode, i wykonaj globalne wyszukiwanie nazwy ViewController, która zgłasza błąd.

  1. Zmień nazwę / popraw wszelkie błędne nazwy, które znajdziesz.
  2. Zapisz wszystkie zmiany.
  3. Oczyść i zbuduj swój projekt.

Teraz wszystko powinno działać dobrze.

Jest to najczęściej spowodowane zmianą nazw plików z poziomu Xcode.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.