iOS 7 - не вдалося створити екземпляр контролера подання за замовчуванням


93

Я використовую Xcode 5 у нещодавно створеній програмі, і коли я просто створюю її, я натискаю кнопку запуску e і натискаю на неї, тоді проект будується, але він не відображається в iOS Simulator, і я отримую таке повідомлення:

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

Звичайно, я погуглив про це, і всі вказують, що це відбувається, тому що XCode ще не знає, який контролер подання є початковим. Але дивним є те, що я створив додаток як сторінку (також спробував параметри додатків з одним переглядом та вкладками), і XCode вже визначив для неї розкадрування.

Крім того, коли я переходжу до основного варіанту інтерфейсу проекту, встановлюється розкадровка (названа "Основним" від самого Xcode), а в Розкадруванні мій контролер перегляду встановлюється як "Початковий контролер перегляду"

введіть тут опис зображення

Що не так?


спробуйте встановити це програмно ...
Shamsudheen TK 02

@Ramshad Привіт, я свого роду новачок у розробці iOS. Як я можу це зробити?
rodrigoalvesvieira 02


2
Обов’язково встановіть контролер перегляду як початковий.
Сандіп

Як зазначив Кашіф Ахмед, вам також потрібно відкрити файл Info.plist у якості вихідного коду та відредагувати рядок <key> UISceneStoryboardFile </key> та вказати там назву вашої нової розкадровки.
богдан

Відповіді:


56

Тож це теж трапилося зі мною. Я перевірив 50 разів, і мій "Є початковий контролер перегляду", повірте. Це сталося несподівано. То як я це виправив?

  1. Створіть у своєму проекті нову Раскадровку, назвіть її приблизно так: Main_iPhoneV2 (або iPadV2 залежно від вашого оригінального стилю розкадровки)
  2. Відкрийте розбиту раскадровку, клацніть де завгодно в білій області та натисніть command-a, потім command-c (виділіть все та скопіюйте)
  3. Відкрийте свою нову раскадровку та натисніть command-v, щоб вставити ті самі точні налаштування
  4. Перейдіть до налаштувань проекту, змініть "Основний інтерфейс" на новий Main_iPhoneV2 (якщо це ваш iPad і ви пишете універсальний додаток, вам доведеться відредагувати -Info.plist і шукати значення "Основний файл розкадровки" базова назва (iPad)
  5. Перекомпілюйте і припиніть виривати волосся

3
зіткнувся з тією ж проблемою під час виконання кроків, перелічених у Основах розробника. Створив нову Раскадровку, позначив нову як початковий контролер перегляду та встановив нову як Основну дошку сюжетів через Інформацію про розгортання проектів. Це чарівно почало працювати. Не впевнений, що це якась помилка з Xcode. developer.apple.com/library/ios/referencelibrary/GettingStarted/…
ioWint

Це не спрацювало, або я вважаю, що не буде працювати, якщо і доки початковий контролер навігації не буде встановлений як "is Inital View Controller".
Суміт Кумар Саха

Я збирався спробувати це. Але потім я знову почистив і побудував, і це спрацювало
Skywalker

305

Перевірка - це початковий контролер подання в інспекторі атрибутів.

введіть тут опис зображення


Звичайно, це "так, як це має працювати". Але я також зіткнувся з "помилкою", і тоді це не працює. Створення нового та копіювання всіх ваших речей справді спрацювало! в моєму випадку.
Tys

Але його контролер перегляду вже встановлений як початковий контролер перегляду, чи не так?
Юрій Василенко

@YuraVasylenko: Це не було раніше, тому я вказав позначку як обрану.
Ашвін Аджадія

1
Тільки для того, щоб зробити його дещо докладнішим для тих, хто цього потребує, встановлення початкового контролера для розкадрування
Сергій Башаров

40

Спочатку клацніть на View Controller на правій панелі утиліт . Далі виберіть Інспектор атрибутів і переконайтеся, що в розділі Контролер перегляду встановлено прапорець «Є початковим контролером перегляду» !


1
Це була моя проблема. Я видалив контролер перегляду за замовчуванням, який був у моїй розкадровці, і коли я додав інший, він повинен був перевірити це.
Orgmir

17

Це попередження також повідомляється, якщо у вас є такий код:

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

У цьому випадку перейдіть на першу сторінку цільових налаштувань і встановіть Main Interfaceзначення порожнім, оскільки вам не потрібен запис розкадровки для вашого додатка.


14

Використання Interface Builder:

Перевірте, чи встановлено параметр " Є початковий контролер перегляду ". Ви можете встановити його, використовуючи кроки нижче:

  1. Виберіть свій контролер перегляду (який має з’явитися як початковий екран).
  2. Виберіть Інспектор атрибутів у вікні Службові програми .
  3. Виберіть " Є початковий контролер перегляду " в розділі " Контролер перегляду " (якщо ні).

Якщо ви зробили цей крок і все ще отримуєте помилку uncheck and do it again.

Кроки для вирішення проблеми

Використовуючи програмно:

Завдання-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;

Стрімкий:

        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
Якщо ви робите це програмно, не забудьте видалити свою розкадровку з основного інтерфейсу цілі - просто залиште це поле порожнім. Також це має зайти didFinishLaunchingWithOptions.
Jordan H

@JordanH як видалити раскадровку з головного інтерфейсу цілей?
PascalS

@Passe Виділіть текст і натисніть «Видалити», це на вкладці «Загальні»
Jordan H

12

Я переживав це з моїм контролером панелі вкладок, який не з’являвся у тренажері разом із чорним екраном. Я зробив наступне, щоб мій додаток з’явився в Симуляторі.

  1. Перейдіть до Main.storyboard.
  2. Перевірте на Is Initial View Controllerвкладці Інспектор атрибутів.

Є початковим контролером подання в інспекторі атрибутів.


10

Налаштуйте вікно вручну,

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

Чи потрібно для цього зняти прапорець з початкового контролера перегляду в розкадруванні?
bdv

7

Я отримую цю помилку, коли змінюю ім'я файлу розкадровки " Main.storyboard " НА: " XXX.storyboard "

Рішенням для мене було:

  • Продукт-> Чистий
  • ЗМІНА: Підтримка файлів -> info.plist -> Основна назва файлу основної розкадровки -> Основна ДО: XXX

Щасти



3

введіть тут опис зображення

Крім правильної відповіді вище, переконайтеся, що ви встановили правильний головний інтерфейс загалом.


3

1-й варіант

якщо ви хочете встановити власну розкадрування замість контролера перегляду за замовчуванням.

Змініть цей атрибут із файлу info.plist

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

Включення буде вашою назвою розкадровки

щоб відкрити цей файл правою кнопкою миші на файлі info.plist і відкрити як вихідний код

2-й варіант

1- Клацніть на своєму проекті

2- Виберіть свій проект із цільового розділу

3- Перейдіть до розділу Інтерфейс розгортання

4- Змініть розділ розкадровки в полі Основний інтерфейс

Будь ласка, пам’ятайте, встановіть контролер початкового перегляду своєї розкадровки


1
Річ <key> UISceneStoryboardFile </key> виправила це для мене. Дякую.
богдан

2

Якщо ви додали нову розкадрування, то вам доведеться перевірити наступні пункти.

1) У вашому файлі plist перевірка значення основного імені файлу Основної розкадровки (iPad) або (iPhone) має відповідати імені вашого файлу розкадровки ( не додавати розширення .storyboard )

2) У розкадровці повинен бути один контролер перегляду, який встановлений як початковий контролер перегляду

3) Очистіть і побудуйте свій проект. :)

введіть тут опис зображення


1

Якщо ви регулярно передавали код коду керування джерелами, це може позбавити вас від клопоту зі створенням нової розкадровки та, можливо, появою нових проблем ...

Я зміг це вирішити, порівнявши вихідний код Git версії, яка працювала проти зламаної. Різниця показала, що перший рядок повинен містити ідентифікатор початкового контролера перегляду, в моєму випадку InitialViewController = "Q7U-eo-vxw" . Я шукав у вихідному коді, щоб переконатися, що ідентифікатор існує. Все, що мені потрібно було повернути назад, і все знову запрацювало!

<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>

Ось кілька кроків, які можуть допомогти вам усунути неполадки:

  1. Клацніть правою кнопкою миші невдалу розкадрування та скористайтеся пунктом Контроль джерела> Фіксувати ..., щоб зберегти зміни після останнього коміту.
  2. Спробуйте клацнути правою кнопкою миші на вашій невдалій Раскадровці та використовуйте "Відкрити як> Вихідний код", щоб переглянути XML розкадрування.
  3. В елементі документа знайдіть атрибут з назвою " InitialViewController ". Якщо він відсутній, не хвилюйтеся, ми це виправимо. Якщо він є, двічі клацніть ідентифікатор, який йому призначений, command-c, щоб скопіювати його, command-f command-v, щоб знайти його глибше в документі. Це ідентифікатор контролера, який повинен надати початковий вигляд. Якщо це не визначено в документі, то це проблема - вам слід видалити його з тегу документа, в моєму випадку InitialViewController = "Q7U-eo-vxw" .
  4. Перейдіть до пункту меню Xcode під назвою Перегляд і виберіть Редактор версій> Показати порівняльний вигляд
  5. Тут показано вашу місцеву версію зліва та історичну версію праворуч. Клацніть на дату під історичною версією, щоб отримати список комітів для цієї дошки. Виберіть той, який, на вашу думку, працював, і порівняйте елемент документа . Що таке ідентифікатор * InitialViewController ? Це інакше? Якщо так, спробуйте відредагувати його вручну та запустити. xcode історичний інструмент порівняння в дії -

1

Перевірте, чи є у вас вікно var в AppDelegate.

var window: UIWindow? 

А також перевірте розкадрування вашого файлу Info.plist.

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

Програмне встановлення rootViewController в AppDelegate не збирається виправляти попередження. Ви повинні вибрати, чи дозволяти в розкадруванні встановлювати контролер подання, або робити це програмно.


1

Проектів, створених у Xcode 11 і вище, просто змінити файл головного інтерфейсу в налаштуваннях проекту буде недостатньо.

Вам потрібно вручну відредагувати файл Info.plist і також встановити назву розкадрування UISceneStoryboardFile.


1

Жодне з наведеного не вирішило проблему для мене. У моєму випадку це також не було встановлення правильного маніфесту сцени програми.

Мені довелося змінити LoginScreen, який був головним

введіть тут опис зображення


Здивовано це не набрало стільки голосів. Це відбуватиметься практично в будь-якій реалізації SceneDelegate (яка не використовує Storyboard як початковий контролер).
bauerMusic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.