iOS 7 - niepowodzenie tworzenia wystąpienia domyślnego kontrolera widoku


94

Używam Xcode 5 w nowo utworzonej aplikacji i kiedy po prostu ją utworzę, idę na przycisk uruchamiania i klikam na niego, a następnie projekt zostaje zbudowany, ale nie jest wyświetlany w symulatorze iOS i otrzymuję następujący komunikat:

 Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - 
 perhaps the designated entry point is not set?

Szukałem o tym w Google i wszyscy zwracają uwagę, że tak się dzieje, ponieważ XCode nie wie jeszcze, który kontroler widoku jest początkowy. Ale dziwne jest to, że stworzyłem aplikację jako aplikację opartą na stronie (wypróbowałem również opcje aplikacji z pojedynczym widokiem i kartami), a XCode już zdefiniował dla niej Storyboard.

Ponadto, gdy przechodzę do opcji głównego interfejsu projektu, ustawiany jest scenorys (o nazwie „Główny” przez sam Xcode), aw Storyboard mój kontroler widoku jest ustawiony jako „Początkowy kontroler widoku”

wprowadź opis obrazu tutaj

Co jest nie tak?


spróbuj ustawić to programowo ...
Shamsudheen TK,

@Ramshad Cześć, jestem trochę nowicjuszem w programowaniu na iOS. Jak mogę to zrobić?
rodrigoalvesvieira


2
Upewnij się, że kontroler widoku został ustawiony jako początkowy kontroler widoku.
Sandeep

Jak zauważył Kashif Ahmed, musisz również otworzyć plik Info.plist jako kod źródłowy i edytować ciąg <key> UISceneStoryboardFile </key> i podać tam nazwę swojego nowego storyboardu.
bogdan

Odpowiedzi:


56

Więc to też przydarzyło się mnie. Sprawdziłem 50 razy i mój „Is Initial View Controller” został sprawdzony, wierz mi. Stało się to niespodziewanie. Więc jak to naprawić?

  1. Utwórz nowy Storyboard w swoim projekcie, nazwij go na przykład Main_iPhoneV2 (lub iPadV2 w zależności od oryginalnego stylu storyboardu)
  2. Otwórz zepsuty scenorys, kliknij w dowolnym miejscu białego obszaru i naciśnij Command-a, a następnie Command-C (zaznacz wszystko i skopiuj)
  3. Otwórz nowy scenorys i naciśnij klawisze Command-v, aby wkleić tę samą dokładną konfigurację
  4. Przejdź do ustawień projektu, zmień "Główny interfejs" na nowy Main_iPhoneV2 (jeśli to Twój iPad i piszesz uniwersalną aplikację, będziesz musiał edytować -Info.plist i poszukać wartości "Główny plik scenorysu nazwa podstawowa (iPad)
  5. Przekompiluj i przestań wyrywać włosy

3
napotkał ten sam problem podczas wykonywania czynności wymienionych w Podstawach programisty. Utworzono nowy scenorys, oznaczyłem nowy jako początkowy kontroler widoku i ustawiono nowy jako główną planszę scenariuszy za pośrednictwem informacji o wdrożeniu projektów. Zaczęło działać magicznie. Nie jestem pewien, czy to jakiś błąd w Xcode. developer.apple.com/library/ios/referencelibrary/GettingStarted/ ...
ioWint

To nie zadziałało lub uważam, że nie zadziała, chyba że i dopóki początkowy kontroler nawigacji nie zostanie ustawiony jako „jest kontrolerem widoku początkowego”.
Sumit Kumar Saha

Miałem zamiar tego spróbować. Ale potem wyczyściłem i zbudowałem ponownie i zadziałało
Skywalker

306

Sprawdź, czy jest początkowym kontrolerem widoku w Inspektorze atrybutów.

wprowadź opis obrazu tutaj


Oczywiście to „tak powinno działać”. Ale napotkałem również „błąd”, a potem to nie działa. Utworzenie nowego i skopiowanie wszystkich rzeczy zadziałało! w moim przypadku.
Tys

Ale jego kontroler widoku jest już ustawiony jako początkowy kontroler widoku, prawda?
Iurii Vasylenko

@YuraVasylenko: To nie było wcześniej, więc zaznaczyłem jako wybrane.
Ashvin Ajadiya

1
Aby uczynić to nieco bardziej szczegółowym dla tych, którzy tego potrzebują, ustawianie początkowego kontrolera dla scenorysu
Siergiej Baszarow

41

Najpierw kliknij kontroler widoku na pasku narzędzi po prawej stronie . Następnie wybierz Inspektor atrybutów i upewnij się, że w sekcji Kontroler widoku zaznaczone jest pole wyboru „Jest początkowym kontrolerem widoku” !


1
To był mój problem. Usunąłem domyślny kontroler widoku, który miał mój storyboard, a kiedy dodałem inny, musiałem to sprawdzić.
Orgmir

18

To ostrzeżenie jest również zgłaszane, jeśli masz kod, taki jak:

    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = myAwesomeRootViewController
    window?.makeKeyAndVisible()

W takim przypadku przejdź do pierwszej strony ustawień docelowych i ustaw Main Interfacejako puste, ponieważ nie potrzebujesz wpisu scenorysu dla swojej aplikacji.


14

Korzystanie z programu Interface Builder:

Sprawdź, czy ustawiono „ Jest kontrolerem widoku początkowego ”. Możesz to ustawić, wykonując poniższe czynności:

  1. Wybierz kontroler widoku (który ma się pojawić jako ekran początkowy).
  2. Wybierz Inspektor atrybutów z okna Narzędzia .
  3. Wybierz „ Jest początkowym kontrolerem widoku ” z sekcji Kontroler widoku (jeśli nie).

Jeśli wykonałeś ten krok i nadal pojawia się błąd uncheck and do it again.

Kroki do rozwiązania problemu

Używanie programowo:

Cel C :

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

Szybki:

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true

3
Jeśli robisz to programowo, pamiętaj, aby usunąć scenorys z głównego interfejsu celu - po prostu pozostaw to pole puste. To też powinno wejść didFinishLaunchingWithOptions.
Jordan H

@JordanH jak usunąć scenorys z głównego interfejsu celów?
PascalS

@Passe Zaznacz tekst i wciśnij usuń, jest w zakładce Ogólne
Jordan H,

12

Doświadczyłem tego, gdy mój kontroler paska zakładek nie pojawiał się w symulatorze wraz z czarnym ekranem. Wykonałem następujące czynności, aby moja aplikacja pojawiła się w symulatorze.

  1. Przejdź do Main.storyboard.
  2. Sprawdź Is Initial View Controllerpod zakładką Inspektor atrybutów.

Jest początkowym kontrolerem widoku w Inspektorze atrybutów.

Jeśli przypadkowo usunąłeś ten kontroler widoku lub w inny sposób nie ustawiłeś go jako domyślnego, zobaczysz błąd „Nie udało się utworzyć wystąpienia domyślnego kontrolera widoku dla UIMainStoryboardFile 'Main' - być może wyznaczony punkt wejścia nie jest ustawiony?” po uruchomieniu aplikacji wraz z prostym czarnym ekranem.

Aby rozwiązać problem, otwórz plik Main.storyboard i znajdź dowolny kontroler widoku, który ma być wyświetlany po pierwszym uruchomieniu aplikacji. Kiedy jest zaznaczone, przejdź do inspektora atrybutów i zaznacz pole „Jest początkowym kontrolerem widoku”. Po lewej stronie tego kontrolera widoku powinna pojawić się strzałka skierowana w prawo, pokazująca, że ​​jest to punkt wejścia do scenorysu.


10

Skonfiguruj okno ręcznie,

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (!application.keyWindow.rootViewController) 
     {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *myViewController= [storyboard instantiateViewControllerWithIdentifier:@"myViewController identifier"];

         application.keyWindow.rootViewController = myViewController;
     }
}

Czy to wymaga odznaczenia początkowego kontrolera widoku w scenorysie?
bdv

7

Ten błąd pojawia się, gdy zmieniam nazwę pliku scenorysu „ Main.storyboard ” NA: „ XXX.storyboard

Rozwiązaniem dla mnie było:

  • Produkt-> Wyczyść
  • ZMIANA: Obsługiwane pliki -> info.plist -> Nazwa bazowa pliku storyboardu głównego -> Główny DO: XXX

Powodzenia



3

wprowadź opis obrazu tutaj

Oprócz powyższej poprawnej odpowiedzi, upewnij się również, że masz ustawiony poprawny interfejs główny w ogóle.


3

1 opcja

jeśli chcesz ustawić niestandardowy scenorys zamiast domyślnego kontrolera widoku.

Zmień ten atrybut z pliku info.plist

<key>UISceneStoryboardFile</key> <string>Onboarding</string>

Wdrażanie byłby nazwą Twojego scenariusza

aby otworzyć ten plik, kliknij prawym przyciskiem myszy plik info.plist i otwórz jako kod źródłowy

2. opcja

1- Kliknij swój projekt

2- Wybierz swój projekt z sekcji docelowej

3- Przejdź do interfejsu wdrażania sekcji

4- Zmień sekcję scenorysu z pola głównego interfejsu

Pamiętaj, aby ustawić początkowy kontroler widoku scenorysu


1
Rzecz <key> UISceneStoryboardFile </key> naprawiła to dla mnie. Dzięki.
bogdan

2

Jeśli dodałeś nowy scenorys, musisz sprawdzić następujące punkty.

1) W pliku plist wartość sprawdzania nazwy podstawowej pliku storyboardu głównego (iPad) lub (iPhone) powinna być dopasowana do nazwy pliku storyboardu ( nie dodawaj rozszerzenia .storyboard )

2) W scenorysie powinien znajdować się jeden kontroler widoku, który jest ustawiony jako początkowy kontroler widoku

3) Oczyść i skompiluj swój projekt. :)

wprowadź opis obrazu tutaj


1

Jeśli regularnie oddawałeś swój kod do kontroli źródła, może to zaoszczędzić Ci kłopotów z tworzeniem nowego Storyboardu i prawdopodobnie wprowadzaniem większej liczby problemów ...

Udało mi się to rozwiązać, porównując kod źródłowy Gita wersji, która działała z zepsutą. Różnica pokazała, że ​​pierwsza linia powinna zawierać identyfikator początkowego kontrolera widoku, w moim przypadku initialViewController = "Q7U-eo-vxw" . Przeszukałem kod źródłowy, aby upewnić się, że identyfikator istnieje. Wszystko, co musiałem zrobić, to odłożyć go i wszystko znowu działało!

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="Q7U-eo-vxw">
    <dependencies>
        <deployment defaultVersion="1296" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <scenes>

Oto kilka kroków, które mogą pomóc w rozwiązaniu problemu:

  1. Kliknij prawym przyciskiem myszy uszkodzony scenorys i użyj opcji Kontrola źródła> Zatwierdź ..., aby zachować zmiany od ostatniego zatwierdzenia.
  2. Spróbuj kliknąć prawym przyciskiem myszy swoją wadliwą scenorys i użyj „Otwórz jako> Kod źródłowy”, aby wyświetlić XML scenorysu.
  3. W elemencie dokumentu poszukaj atrybutu o nazwie „ initialViewController ”. Jeśli go brakuje, nie martw się, naprawimy to. Jeśli tam jest, kliknij dwukrotnie identyfikator, który jest do niego przypisany, polecenie-c, aby go skopiować, polecenie-f polecenie-v, aby wyszukać go głębiej w dokumencie. To jest identyfikator kontrolera, który powinien zapewnić wstępny widok. Jeśli nie jest zdefiniowany w dokumencie, to jest problem - należy go usunąć z tagu dokumentu, w moim przypadku initialViewController = "Q7U-eo-vxw" .
  4. Przejdź do elementu menu Xcode o nazwie Widok i wybierz Edytor wersji> Pokaż widok porównania
  5. To pokazuje twoją lokalną wersję po lewej i historyczną wersję po prawej. Kliknij datę pod wersją historyczną, aby uzyskać listę zatwierdzeń dla tej tablicy. Wybierz taki, o którym wiesz, że działał i porównaj element dokumentu . Jaki jest identyfikator * initialViewController ? Czy to jest inne? Jeśli tak, spróbuj edytować go ręcznie i uruchom. Narzędzie do porównywania danych historycznych xcode w akcji

1

Sprawdź, czy masz okno var w AppDelegate.

var window: UIWindow? 

Sprawdź także scenorys swojego pliku Info.plist.

<key>UIMainStoryboardFile</key>
<string>Main</string>

Programowe ustawienie rootViewController w AppDelegate nie naprawi ostrzeżenia. Powinieneś wybrać, czy pozwolić scenorysowi ustawić kontroler widoku, czy zrobić to programowo.


1

Projekty utworzone w Xcode 11 i nowszych, po prostu zmiana pliku głównego interfejsu w ustawieniach projektu nie wystarczy.

Musisz ręcznie edytować plik Info.plist i ustawić nazwę storyboardu UISceneStoryboardFilerównież dla.


1

Żadne z powyższych nie rozwiązało problemu. W moim przypadku nie było to również ustawienie poprawnego manifestu sceny aplikacji.

Musiałem zmienić LoginScreen na Main

wprowadź opis obrazu tutaj


Zaskoczony, że nie uzyskał tylu głosów. Będzie to miało miejsce w praktycznie każdej implementacji SceneDelegate (która nie używa Storyboard jako kontrolera początkowego).
bauerMusic
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.