IOS 7 - Не удалось создать экземпляр контроллера по умолчанию

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

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

Я, конечно, об этом разобрался, и все отмечают, что это происходит, потому что XCode еще не знает, какой контроллер представлений является исходным. Но странно, что я создал приложение как основанное на странице (также попробованное приложение с одним и несколькими вкладками), и XCode уже определил для него раскадровку.

Кроме того, когда я перехожу к основному интерфейсу проекта, раскадровка (называемая "Main" самой Xcode) установлена, а в Storyboard мой контроллер представления установлен как "Начальный контроллер просмотра"

enter image description here

Что не так?

Ответ 1

Так и случилось со мной. Поверьте, я проверил 50 раз, и мой "Контроллер начального просмотра" был проверен. Это случилось неожиданно. Так как я это исправил?

  • Создайте новую раскадровку в своем проекте, назовите ее чем-то вроде Main_iPhoneV2 (или iPadV2 в зависимости от вашего оригинального стиля раскадровки).
  • Откройте сломанную раскадровку, щелкните в любом месте белой области и нажмите команду-a, затем команду-c (выберите все и скопируйте)
  • Откройте новую раскадровку и нажмите команду-v, чтобы вставить ту же самую точную настройку
  • Перейдите в настройки своего проекта, измените свой "Основной интерфейс" на новый Main_iPhoneV2 (если это ваш iPad и вы пишете универсальное приложение, вам придется отредактировать -Info.plist и искать значение " Основное имя основной раскадровки (iPad).
  • Перекомпилируйте и прекратите вытягивать волосы.

Ответ 2

Отметьте Контроллер начального просмотра в Инспекторе атрибутов.

enter image description here

Ответ 3

Сначала щелкните на контроллере просмотра в правой части панели Утилиты. Затем выберите Attributes Inspector и убедитесь, что в разделе "Контроллер просмотра" отмечен флажок "Исходный контроллер просмотра" !

Ответ 4

Использование Interface Builder:

Проверьте, установлен ли "Контроллер начального представления". Вы можете установить его, используя следующие шаги:

  • Выберите свой контроллер просмотра (который должен отображаться как начальный экран).
  • Выберите "Инспектор атрибутов" в окне "Утилиты".
  • Выберите "Исходный контроллер просмотра" из раздела "Контроллер просмотра" (если нет).

Если вы сделали этот шаг и все еще получаете ошибку, тогда uncheck and do it again.

Шаги для решения проблемы

Использование программно:

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

Swift:

        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

Ответ 5

Настройте окно вручную,

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

Ответ 6

Это предупреждение также сообщается, если у вас есть код:

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

В этом случае перейдите на первую страницу целевых настроек и установите для параметра Main Interface значение empty, так как вам не нужна запись в виде раскадровки для вашего приложения.

Ответ 7

Продукт "Чистый" был для меня решением.

Ответ 8

Я получаю эту ошибку, когда меняю имя файла раскадровки Main.storyboard "TO:" XXX.storyboard "

Решение для меня было:

  • Product- > Clean
  • ИЗМЕНИТЬ: Поддержка файлов info.plist Основная база данных основной раскадровки Главная TO: XXX

Удача

Ответ 9

Если вы добавили новую раскадровку, вам нужно проверить следующие пункты.

1) В вашем файле plist проверьте значение базового имени основной раскадровки (iPad) или (iPhone) с вашим именем файла раскадровки (не добавляйте расширение .storyboard)

2) В раскадровке должен быть один контроллер вида, который устанавливается как Является ли контроллер начального представления

3) Очистите и создайте свой проект.:)

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

Ответ 10

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

Помимо правильного ответа, также убедитесь, что вы установили правильный основной интерфейс в целом.

Ответ 11

Если вы регулярно управляете своим кодом для контроля источника, это может сэкономить вам хлопоты на создание новой раскадровки и, возможно, вызвать больше проблем...

Я смог решить это, сравнив исходный код 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>

Ниже приведены некоторые шаги, которые помогут вам устранить неполадки:

  • Щелкните правой кнопкой мыши неудачную раскадровку и используйте Source Control > Commit..., чтобы сохранить ваши изменения со времени последнего коммита.
  • Попробуйте щелкнуть правой кнопкой мыши свою неудачную раскадровку и использовать "Открыть как > исходный код", чтобы просмотреть XML раскадровки.
  • В элементе документа найдите атрибут с именем " initialViewController". Если он отсутствует, не беспокойтесь, мы это исправим. Если он есть, дважды щелкните идентификатор, назначенный ему, command-c, чтобы скопировать его, command-f command-v, чтобы найти его глубже в документе. Это идентификатор контроллера, который должен предоставить начальное представление. Если это не определено в документе, это проблема - вы должны удалить его из тега документа, в моем случае initialViewController = "Q7U-eo-vxw" .
  • Перейдите в пункт меню Xcode под названием "Просмотр" и выберите "Редактор версий" > "Показать сравнение"
  • Это показывает вашу локальную версию слева и историческую версию справа. Нажмите на дату под исторической версией, чтобы получить список коммитов для этой истории. Выберите тот, который вы знаете, и сравните элемент document. Что такое идентификатор * initialViewController? Разве это другое? Если да, попробуйте вручную отредактировать его и запустить. xcode historical compare tool in action