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


93

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

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

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

Кроме того, когда я перехожу к опции основного интерфейса проекта, раскадровка (названная «Main» самим Xcode) устанавливается, а в Storyboard мой контроллер представления устанавливается как «Initial View Controller»

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

Что случилось?


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

@Ramshad Привет, я новичок в разработке iOS. Как я могу это сделать?
rodrigoalvesvieira 02


2
Обязательно установите контроллер представления как начальный контроллер представления.
Sandeep

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

Ответы:


56

Так случилось и со мной. Я проверил 50 раз, и мой "Is Initial View Controller" был проверен, поверьте мне. Это случилось неожиданно. Так как я это исправил?

  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

Это не сработало или я считаю, что не будет работать, если и до тех пор, пока начальный контроллер навигации не будет установлен как «Контроллер начального представления».
Sumit Kumar Saha

Я собирался попробовать это. Но потом я снова почистил и построил, и это сработало
Скайуокер

306

Проверьте, является ли начальный контроллер представления в инспекторе атрибутов.

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


Конечно, так и должно работать. Но я тоже столкнулся с «ошибкой», и тогда это не работает. Создание нового и копирование всего вашего сработало! в моем случае.
Tys

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

@YuraVasylenko: Раньше не было, поэтому я пометил как выбранное.
Ашвин Аджадия 08

1
Просто чтобы сделать его более подробным для тех, кому это нужно, Настройка начального контроллера для раскадровки
Сергей Башаров

40

Сначала нажмите View Controller на правой панели Utilities . Затем выберите Attributes Inspector и убедитесь, что в разделе View Controller установлен флажок Is Initial View Controller !


1
Это была моя проблема. Я удалил контроллер представления по умолчанию, который был у моей раскадровки, и когда я добавил другой, мне пришлось это проверить.
Orgmir

18

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

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

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


14

Используя Интерфейсный Разработчик:

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

  1. Выберите контроллер представления (который должен отображаться как начальный экран).
  2. Выберите Атрибут инспектор из утилит окна.
  3. Выбрать ' Является Initial View Controller ' от View Controller секции (если нет).

Если вы выполнили этот шаг и по-прежнему получаете ошибку, то 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;

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

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 версии, которая работала, с неработающей. Сравнение показало, что первая строка должна содержать Id исходного контроллера представления, в моем случае 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. Щелкните правой кнопкой мыши сбойную раскадровку и выберите Source Control> Commit ..., чтобы сохранить изменения с момента последней фиксации.
  2. Попробуйте щелкнуть правой кнопкой мыши неудачную раскадровку и использовать «Открыть как> Исходный код», чтобы просмотреть XML раскадровки.
  3. В элементе документа найдите атрибут с именем « initialViewController ». Если его нет - не волнуйтесь, мы это исправим. Если он есть, дважды щелкните назначенный ему идентификатор, command-c, чтобы скопировать его, command-f, command-v, чтобы найти его глубже в документе. Это идентификатор контроллера, который должен обеспечивать начальное представление. Если он не определен в документе, то это проблема - вы должны удалить его из тега документа, в моем случае initialViewController = "Q7U-eo-vxw" .
  4. Перейдите в пункт меню Xcode под названием "Просмотр" и выберите "Редактор версий"> "Показать представление сравнения".
  5. Это показывает вашу локальную версию слева и историческую версию справа. Нажмите на дату под исторической версией, чтобы получить список коммитов для этой раскадровки. Выберите тот, который, как вы знаете, работал, и сравните элемент документа . Что такое идентификатор * initialViewController ? Это другое? Если да, попробуйте отредактировать его вручную и запустить. Инструмент исторического сравнения xcode в действии

1

Проверьте, есть ли у вас переменная окна в 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.