Xcode: „Scena jest nieosiągalna z powodu braku punktów wejścia”, ale nie może jej znaleźć


89

Xcode 4.5.2 daje mi następujące ostrzeżenie:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

Niestety nie mogę zidentyfikować oskarżonej sceny. Wybranie ostrzeżenia w nawigatorze problemów nie powoduje podświetlenia niczego w serii ujęć. Mam dość skomplikowaną scenorys (ponad 30 scen).

Jakieś sugestie?

Zrzut ekranu ostrzeżenia

Odpowiedzi:


50

Chociaż ten wątek jest stary, nie widziałem odpowiedzi opisującej, co zadziałało dla mnie, więc oto ...

Miałem ten błąd i wizualne badanie scenorysu pokazało, że wszystkie kontrolery widoku wydają się być połączone z głównym kontrolerem widoku.

Próbowałem nazwać wszystkie 17 kontrolerów widoku w scenorysie (jak w odpowiedzi @ bobnoble). Użyłem konwencji nazewnictwa opartej na długiej nazwie kontrolera widoku, np. „Jvc” dla „Jobs View Controller”. Kiedy próbowałem budować, otrzymałem komunikat o błędzie wskazujący, że jeden z kontrolerów widoku ma zduplikowaną nazwę. Śledząc rzeczy, odkryłem, że mam rzeczywisty duplikat kontrolera widoku ułożony dokładnie na swoim bliźniaku. Podejrzewam, że było to uszkodzenie typu „wytnij i wklej” z eksperymentu z interfejsem użytkownika, którego nie wycofałem całkowicie.

W każdym razie usunięcie niepołączonego bliźniaka rozwiązało mój problem. Następnie usunąłem wszystkie nazwy VC, ponieważ nie ma do nich odniesień w kodzie.


3
Mnie też się to przydarzyło, ale nadal musiałem wypełnić jeden z wielu pustychStoryboard ID
Pierre de LESPINAY

... wtedy uważam, że @bobnoble jest poprawną odpowiedzią oznaczoną √
SwiftArchitect

139

W swojej serii ujęć wybierz każdy z kontrolerów widoku (czerwona strzałka na obrazku poniżej) i spójrz na pole Identyfikator serii ujęć (czerwony owal). Żadne z pól identyfikatora scenorysu nie powinno być puste. Kiedy znajdziesz taki, to jest winowajcą.

wprowadź opis obrazu tutaj


6
Cześć @bobnoble, dziękuję za odpowiedź. Jedno pytanie: dlaczego powinienem ustawić identyfikator Storyboard dla każdej sceny? Nie sądzę, żeby to było obowiązkowe, prawda? Wiem, że muszę ustawić identyfikator, jeśli chcę programowo uzyskać dostęp do sceny, ale co, jeśli wszystkie moje sceny są połączone za pomocą segmentów? A może to tylko dobra praktyka programistyczna?
Wolfy

@Wolfy - dobra uwaga, musisz przyjrzeć się każdemu, aby upewnić się, że ma identyfikator segue lub Storyboard.
bobnoble

2
Próbując tego rozwiązania, zdałem sobie sprawę, że wypełnienie tylko jednego konkretnego Storyboard IDusunęło ostrzeżenie
Pierre de LESPINAY

Miałem UINavigationControllerkilka UIViewControllersi musiałem ustawić dla nich identyfikator, nawet nigdy nie dzwoniłem do żadnego z nich po identyfikatorze. Naprawdę irytujące, szukanie błędu tam, gdzie nikogo nie ma!
Alex Cio

Pracuje dla mnie. Czy ktoś wie, dlaczego tak się dzieje? Wydaje się bardzo nie do wykrycia - błąd podany z perspektywy czasu daje mizerną wskazówkę. Dostałem go po przekonwertowaniu storyboardu na najnowszy i najlepszy - jeśli identyfikator Storyboard jest teraz wymagany, z pewnością nie był wcześniej, a automatyczna konwersja nie zadbała o to.
Josh Sutterfield,

30

Właśnie miałem ten dokładny błąd z prostym scenariuszem z pojedynczą sceną i wszystko, co musiałem zrobić, aby to naprawić, to zaznaczyć pole wyboru „Jest początkowym kontrolerem widoku” dla kontrolera widoku 1 w serii ujęć. Podejrzewam, że Xcode domyślnie zaznaczał to pole w tej sytuacji, ale już tego nie robi.

Zaznacz pole na dole

                                     

Zaznacz pole dokładnie dla jednego z kontrolerów widoku w swoim storyboardzie i powinieneś być dobry.


1
Dzięki. To było to!
Eric Chen

20

Obawiam się, że będziesz musiał przejść przez wszystkie 30 z nich i sprawdzić, czy mają identyfikator Storyboard lub przejście do tego kontrolera widoku. Wymagany jest jeden z dwóch, oba są również opcją.


5
Po tym, jak wszystkie kontrolery widoku mają swój przepływ lub identyfikator, komunikat o błędzie może nadal tam być. W takim przypadku wyczyść produkt i zniknie.
Reinhard Männer

5
W moim przypadku czysty produkt nie wystarczył, aby pozbyć się komunikatu o błędzie po naprawieniu błędu. Zniknął po ponownym uruchomieniu Xcode. (Nie próbowałem zamykać / ponownie
otwierać

To samo dotyczy mnie - w końcu musisz zatrzymać i ponownie uruchomić xcode, aby pozbyć się komunikatu o błędzie.
MusiGenesis

8

Ten problem może wystąpić w jednym z następujących scenariuszy:

Przypadek I: Jeśli żadna scena w serii ujęć nie jest oznaczona jako „isInitialViewController” .

Poprawka: Zidentyfikuj główny kontroler widoku i oznacz go jako „isInitialViewController” w SB. W takim przypadku identyfikator scenorysu nie jest obowiązkowy.

Przypadek II

Mogą wystąpić sytuacje, w których nie trzeba mieć initialViewController w scenorysie. Na przykład: podczas korzystania z wielu scenorysów.

Poprawka: w takich przypadkach upewnij się, że „identyfikator scenorysu” jest poprawnie podany i odwołujesz się do pierwszej sceny używanej w serii ujęć, używając tego identyfikatora. Na przykład:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

W tym przypadku „identyfikator scenorysu” jest obowiązkowy.

Przypadek III

Masz podłączony initialViewController. Ale nadal otrzymujesz to ostrzeżenie. Dzieje się tak, ponieważ niektóre sceny w storyboardzie mogą nie być połączone z „segue”, a także nie mają „identyfikatora scenorysu” . Zeskanuj swój scenorys, zobacz, czy potrzebny jest „ścieg” . Jeśli tego nie ma, podłącz segue. Jeśli płynnie nie jest potrzebne, upewnij się, że musisz podać „identyfikator scenorysu”, ponieważ jest to jedyny sposób na odwołanie się do sceny z kodu, jak pokazano w przykładowym kodzie powyżej.

Mam nadzieję że to pomoże


PRZYPADEK III - pomógł mi. Dzięki!
mrGott

Miałem przypadek, w którym przykładowy projekt przyszedł ze starym plikiem xib. Stworzyłem storyBoard i obecnie cierpię ... muszę przekonwertować xib do formatu storyBoard i przejść z tego miejsca ... nie widzę żadnego sposobu na utworzenie sceny aplikacji lub menu ...
nyxee

6

Nie musisz ustawiać Storyboard IDdla wszystkich scen lubUINavigationController

No cóż, mam około 50-60 scen i właśnie dostałem takie ostrzeżenie, żeby uświadomić sobie, że tylko kontroler (Scena) lub NavigationController, który nie jest połączony z segue, musi ustawić Storyboard ID.

wprowadź opis obrazu tutaj

Widać, że na powyższym obrazku UINavigationControllernie jest to związane z płynem, to był winowajca tego ostrzeżenia.

Po prostu nadaj mu identyfikator Storyboard, aby usunąć to ostrzeżenie.


5

Miałem ten sam problem. Mam wiele widoków na mojej planszy z kontrolerem nawigacyjnym i paskiem kart. Dla mnie było to tylko ostrzeżenie, aby poinformować, że niektóre widoki nie są połączone. Upewnij się, że wszystkie widoki są w jakiś sposób połączone z głównym kontrolerem widoku . Zaczynałem ten projekt od zera, aby wyeliminować to ostrzeżenie i zauważyłem to samo ostrzeżenie, gdy widok nie był podłączony.


To mi pomogło. Używam ponad 7.1.1 Swift 2. Początkowy StoryBoard MUSI być głównym kontrolerem widoku.
Lukesivi

3

Najprostszy sposób na znalezienie obraźliwej sceny:

Przejdź do nawigatora problemów (w lewym panelu obok przycisku wyszukiwania) i dwukrotnie kliknij błąd. Pojawi się okno zawierające przestępczą scenę wyśrodkowaną na środku okna.

(W rzeczywistości jest to ogólnie prawdą - dwukrotne kliknięcie dowolnego błędu zwykle spowoduje wyświetlenie wyskakującego okienka zawierającego wyśrodkowany błąd - fajna mała sztuczka!)

Uwaga dodatkowa: czasami XCode nieprawidłowo poda ten błąd dla sceny, która jest głównym kontrolerem widoku kontrolera nawigacji (to jest początkowy kontroler widoku). Prosta poprawka polega na nadaniu temu kontrolerowi widoku głównego identyfikatora scenorysu, kompilacji (błąd powinien zniknąć), a następnie usunięciu storyboardID (już nie ma błędu).


Dzięki za wskazówkę "Prosta poprawka polega na nadaniu temu kontrolerowi widoku głównego identyfikatora scenorysu". To rozwiązało mój problem. Cóż, muszę podać „Storyboard ID” do UINavigationController.
Mohd Haider

To wskazuje mi na scenę aplikacji z menu głównym. Nie mogę dać tego identyfikatora Storyboard.
Daniel

2

Najłatwiejszym sposobem sprawdzenia, który kontroler lub scena powoduje ten problem, jest:

  • Klikając z wciśniętym klawiszem Ctrl .storyboardw Nawigatorze projektu i wybierając Open As > Source Code. Spowoduje to wyświetlenie podstawowego kodu XML Storyboardu.
  • W tym widoku ostrzeżenie będzie wyraźnie powiązane z wierszem w kodzie XML odnoszącym się do przestępczej sceny.

Teraz, w moim przypadku, ostrzeżenie było szczególnie irytujące, ponieważ „scena przestępcza” miała identyfikator i wyciek! Udało mi się rozwiązać problem, usuwając scenę, a następnie cofając usunięcie. Nie eleganckie, ale działało. Zapisałem mój Storyboard przed zrobieniem tego. Z perspektywy czasu powinienem był zrobić kopię i diffprzed-po.


2
O dziwo, to wydaje się nie działać konsekwentnie. W mojej sytuacji po awarii zadziałało. Teraz to testuję, a Source Codewidok nie pokazuje błędu. Tak więc przebieg może się różnić.
Dmitry Minkovsky

Nie znalazłem kontrolera widoku z tym, ale usunąłem go (w XML, nie działał w ID) i ostrzeżenie zniknęło.
Daniel

2

Dla mnie to nie było z powodu a Storyboard IDlub a Segue. Otrzymałem to ostrzeżenie, ponieważ nie ustawiłem View Controller's Custom Class.

Wybierz View Controllerna Storyboard, a następnie w Utilities Panewybierz Identity Inspectorikonę. Poniżej Custom Classzobacz, jaka wartość znajduje się wewnątrz Classpola.

Jeśli to tylko mówi UIViewController, musisz wpisać nazwę klasy. Będzie to nazwa Twojego pliku .hi .mplików, które tworzą niestandardową UIViewControllerpodklasę.


Właśnie miałem wariację na ten temat. Dopasowałem niewłaściwy ViewController w moim scenorysie do klasy ViewController i to samo z identyfikatorem Storyboard.
Vince O'Sullivan

2

Doszedłem dziś do tego pytania. Używam Xcode 6.3, a odpowiedź na pytanie OP jest teraz dość prosta:

Wybierz kontroler widoku, który chcesz być pierwszym, pokaż Inspektor atrybutów i w sekcji Kontroler widoku upewnij się, że

Jest kontrolerem widoku początkowego

sprawdzone. Voilà!


2

Dzięki Xcode 7 można to łatwo obsłużyć. Nie ma potrzeby ręcznego przeglądania wszystkich scen, aby znaleźć problematyczną. Najpierw przejdź do nawigatora raportów , w którym można uzyskać szczegółowe informacje o znanych problemach. Opis problemu może wyglądać następująco:

Base.lproj / Main.storyboard: fPh-fe-F5F : ostrzeżenie: Scena jest nieosiągalna z powodu braku punktów wejścia i nie ma identyfikatora dostępu w czasie wykonywania za pośrednictwem -instantiateViewControllerWithIdentifier :.

Dzięki tym informacjom możesz skopiować identyfikator obiektu, w tym przypadku był to fPh-fe-F5F , i przeszukać obszar roboczy pod kątem wystąpienia tego ciągu. Ciąg zostanie znaleziony w pliku Main.storyboard. Kliknij dwukrotnie wynik wyszukiwania, a otworzy się Main.storyboard z wybraną sceną. Gdy znasz problematyczną scenę, możesz łatwo rozwiązać problem, ustawiając identyfikator scenorysu lub ustawiając opcję „Jest kontrolerem widoku początkowego”


1

Możesz po prostu ustawić identyfikator. W inspektorze atrybutów w prawym okienku znajdziesz pole o nazwie „Identyfikator”. Po prostu włóż tam dowolny ciąg, to powinno działać

Możesz kliknąć kontroler nawigacji i pod inspektorem atrybutów kliknąć przycisk „jest początkowym kontrolerem widoku”. To też powinno działać.


1
Mohammad, dziękuję za odpowiedź, ale problem jest taki: na której scenie mam ustawić identyfikator? Nie mogę zlokalizować miejsca, które powoduje ostrzeżenie, to jest główny problem.
Wolfy

1

napotkałem ten sam problem i rozwiązałem go, umieszczając w identyfikatorze scenorysu dowolny identyfikator dla wszystkich kontrolerów viewController i NavigationController; błąd zostanie natychmiast usunięty

cieszyć się!!!


0

Może ten XQuery pomoże ci znaleźć te paskudne sceny

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

Jeśli masz zainstalowaną xqillę, możesz zapisać zapytanie do pliku i używać go tak, jak

xqilla <xqueryfile> -i <path to your storyboard>

0

Nie wiem, czy jeszcze o tym nie wspomniano, czy nie, ale innym powodem, dla którego możesz otrzymać to ostrzeżenie, jest to, że masz skręt idący w złym kierunku. Na przykład w moim projekcie otrzymałem to ostrzeżenie, ale wszystkie moje kontrolery były w rzeczywistości połączone. Jednak jeden z nich miał odcinek, który w zasadzie starał się przedstawić rodzica dziecku zamiast rodzica prezentującego dziecko. To spowodowało to samo ostrzeżenie.


0

Otrzymałem to ostrzeżenie, gdy mam UIViewController w Storyboard, do którego nic nie jest ustawione. Uniknąłem tego ostrzeżenia, ustawiając na to identyfikator Storyboard.


0

Miałem ten sam problem, ale zdałem sobie sprawę, że korzystałem z widoku kontenera i zamiast usuwać domyślny kontroler widoku, usunąłem jego płynność, więc kontroler widoku pozostał w scenorysie, podobnie jak ostrzeżenie. Jest to więc jeden z przypadków, w których pojawia się ostrzeżenie, jeśli domyślny kontroler widoku widoku kontenera nie jest poprawnie usuwany, gdy nie jest potrzebny.


0

Próbowałem wszystkiego, co opisano powyżej, bezskutecznie. Miałem wszystko poprawnie podłączone w IB, z dokładnie jednym UIViewControllerwyznaczonym jako główny kontroler widoku. Nie miałem żadnych identyfikatorów, ale dodałem je do wszystkich moich kontrolerów.

Jedynym sposobem mogę dostać ostrzeżenie zniknie było robiąc wszystko powyżej (w tym restarcie komputera i czystym kompilacji) , a następnie przełączenie się na bezbłędną gałąź mojego projektu w git iz powrotem.

Nie jestem pewien, która czynność go naprawiła lub która kombinacja działań, ale nie była to czysta kompilacja. Może to być produkt uboczny Main.storyboard, który zawsze zmienia się po prostym otwarciu, co oznacza, że ​​muszę git commit -m "Stupid storyboard"częściej niż chcę.


0

Oto, co zadziałało dla mnie:

  1. Otwórz scenorys w edytorze tekstu.
  2. Zmień wersję z 3.0 na 2.0, zapisz i zamknij ją.
  3. Otwórz go ponownie w programie Visual Studio. Automatycznie skonwertuje i otworzy dokument.

0

Otrzymałem ten sam błąd: w moim przypadku błąd polegał na tym, że nie zainicjowałem kontrolera widoku w moim storyboardzie.

Naprawienie tego spowodowało usunięcie tego ostrzeżenia.


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.