Xcode: «Сцена недоступна из-за отсутствия точек входа», но не может ее найти


89

Xcode 4.5.2 дает мне следующее предупреждение:

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

К сожалению, я не могу идентифицировать инкриминируемую сцену. Выбор предупреждения в навигаторе проблем ничего не выделяет в раскадровке. У меня довольно сложная раскадровка (30+ сцен).

Какие-либо предложения?

Снимок экрана для предупреждения

Ответы:


50

Хотя эта ветка устарела, я не видел ответа, описывающего, что у меня сработало, так что вот ...

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

Я попытался назвать все 17 контроллеров представления в раскадровке (как в ответе @bobnoble). Я использовал соглашение об именах, основанное на длинном имени контроллера представления, например «jvc» для «Контроллер представления заданий». Когда я попытался построить, я получил сообщение об ошибке, указывающее на то, что один из контроллеров представления имеет повторяющееся имя. Отслеживая вещи, я обнаружил, что у меня есть фактическая копия контроллера представления, расположенная точно поверх его двойника. Я подозреваю, что это было повреждение методом вырезания и вставки в результате эксперимента с пользовательским интерфейсом, от которого я не отказался полностью.

В любом случае, удаление неподключенного близнеца решило мою проблему. После этого я удалил все имена VC, поскольку они не упоминаются в коде.


3
Это случилось и со мной, но мне все равно пришлось заполнить один из многих пустыхStoryboard ID
Pierre de LESPINAY

... тогда я считаю, что @bobnoble - правильный ответ, который должен быть отмечен значком √
SwiftArchitect

139

В раскадровке выберите каждый из контроллеров представления (красная стрелка на изображении ниже) и посмотрите на поле идентификатора раскадровки (красный овал). Ни одно из полей идентификатора раскадровки не должно быть пустым. Когда вы найдете то, что есть, это виноват.

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


6
Привет @bobnoble, спасибо за ответ. Один вопрос: зачем мне устанавливать идентификатор раскадровки для каждой сцены? Я не думаю, что это обязательно, не так ли? Я знаю, что мне нужно установить идентификатор, если я хочу получить программный доступ к сцене, но что, если все мои сцены связаны через сегменты? Или это просто хорошая практика программирования?
Wolfy

@Wolfy - хороший момент, вам нужно посмотреть на каждый, чтобы убедиться, что у него есть идентификатор перехода или раскадровки.
bobnoble

2
Попробовав это решение, я понял, что заполнение только одного конкретного Storyboard ID
удаляет

У меня было UINavigationControllerнесколько, UIViewControllersи мне пришлось установить идентификатор для всех, даже я никогда не называю ни одного из них по идентификатору. Действительно раздражает, ищу баг там, где никого нет!
Alex Cio

Работает для меня. Кто-нибудь знает, почему это возникает? Кажется, что это невозможно обнаружить - данная ошибка, оглядываясь назад, дает скудный ключ к разгадке. Я получил его после преобразования раскадровки в самую последнюю и лучшую - если сейчас требуется идентификатор раскадровки, то определенно не было раньше, и автоконвертация не позаботилась об этом.
Джош Саттерфилд,

30

У меня была именно эта ошибка с простой раскадровкой с одной сценой, и все, что мне нужно было сделать, чтобы исправить это, - это установить флажок «Is Initial View Controller» для 1 контроллера представления в Storyboard. Я подозреваю, что в этой ситуации Xcode по умолчанию ставил для вас этот флажок, но больше не делает этого.

Установите флажок внизу

                                     

Установите флажок только для одного из контроллеров представления в раскадровке, и все будет хорошо.


1
Спасибо. Это было!
Эрик Чен

20

Боюсь, вам придется пройти через все 30 из них и проверить, есть ли у них идентификатор раскадровки или переход к этому контроллеру представления. Один из двух обязателен, оба тоже возможны.


5
После того, как все контроллеры представления получат свой сегмент или идентификатор, сообщение об ошибке может все еще присутствовать. В этом случае очистите изделие, и оно исчезнет.
Reinhard Männer

5
В моем случае чистого продукта было недостаточно, чтобы избавиться от сообщения об ошибке после того, как я исправил ошибку. Он исчез, когда я перезапустил Xcode. (Я не пытался закрыть / снова открыть проект. Возможно, это тоже сработало.)
JulianSymes

То же самое для меня - в конце концов вам нужно остановить и перезапустить xcode, чтобы избавиться от сообщения об ошибке.
MusiGenesis

8

Эта проблема может возникнуть в одном из следующих сценариев:

Случай I. Если ни одна сцена в раскадровке не помечена как isInitialViewController .

Исправление: Определите корневой контроллер представления и пометьте его как «isInitialViewController» в вашем SB. В этом случае идентификатор раскадровки не является обязательным.

Дело II

Могут возникнуть ситуации, когда вам не нужно иметь initialViewController в раскадровке. Например: при использовании нескольких раскадровок.

Исправление: в таких случаях убедитесь, что «идентификатор раскадровки» указан правильно и вы ссылаетесь на первую сцену, которая будет использоваться в раскадровке, используя этот идентификатор. Например:

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

В этом случае "идентификатор раскадровки" является обязательным.

Дело III

Ваш initialViewController подключен. Но все же вы получаете это предупреждение. Это связано с тем, что некоторые сцены в раскадровке могут не быть связаны с «переходом», а также у них нет «идентификатора раскадровки» . Просмотрите свою раскадровку, посмотрите, нужен ли «переход» . Подключите переходник, если он отсутствует. Если переход не требуется, убедитесь, что вам нужно указать «идентификатор раскадровки», поскольку это единственный способ ссылаться на сцену из вашего кода, как показано в примере кода выше.

Надеюсь это поможет


CASE III - выручил меня. Благодарность!
mrGott

У меня был случай, когда образец проекта поставлялся со старым файлом xib. Я создал storyBoard и сейчас страдаю .. мне нужно преобразовать xib в формат storyBoard и двигаться оттуда .. не вижу способа создать сцену приложения или меню ..
nyxee

6

Вам не нужно устанавливать Storyboard IDдля всех сцен илиUINavigationController

Что ж, у меня около 50-60 сцен, и я только что получил это предупреждение, чтобы понять, что нужно установить только контроллер (сцена) или NavigationController, который не связан с segue Storyboard ID.

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

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

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


5

Я была такая же проблема. У меня много просмотров на моей раскадровке с помощью контроллера навигации и панели вкладок. Для меня это было просто предупреждением, чтобы вы знали, что некоторые виды не связаны. Убедитесь, что все ваши представления каким-то образом связаны с корневым контроллером представления . Я начинал этот проект с нуля, чтобы устранить это предупреждение, и заметил такое же предупреждение, когда представление не было подключено.


Мне это помогло. Я использую превосходит 7.1.1 Swift 2. Начальная раскадровка ДОЛЖНА быть корневым контроллером представления.
Lukesivi

3

Самый простой способ найти место нарушения:

Перейдите в навигатор задач (на левой панели, рядом с кнопкой поиска) и дважды щелкните ошибку. Появится всплывающее окно, содержащее сцену с нарушением правил в центре окна.

(На самом деле это действительно так - двойной щелчок по любой ошибке обычно приводит к появлению всплывающего окна, содержащего ошибку по центру - аккуратный маленький трюк!)

Боковое примечание: иногда XCode неверно выдает эту ошибку для сцены, которая является корневым контроллером представления контроллера навигации (то есть начальным контроллером представления). Простое исправление - присвоение этому корневому контроллеру представления идентификатора раскадровки, компиляция (ошибка должна исчезнуть), а затем удаление идентификатора раскадровки (ошибки больше нет).


Спасибо за подсказку: «Простое исправление дает этому корневому контроллеру представления идентификатор раскадровки». Это решило мою проблему. Что ж, мне нужно присвоить «ID раскадровки» UINavigationController.
Mohd Haider

Это указывает мне на сцену приложения с главным меню. Не могу назвать это идентификатором раскадровки.
Даниэль

2

Самый простой способ узнать, какой контроллер или сцена вызывает эту проблему:

  • Удерживая нажатой клавишу Ctrl, щелкните ваш .storyboardв Project Navigator и выберите Open As > Source Code. Это вызовет основной XML раскадровки.
  • В этом представлении предупреждение будет явно связано со строкой в ​​XML, которая относится к нарушающей сцене.

В моем случае предупреждение было особенно раздражающим, потому что у «сцены нарушения» был идентификатор и переход! Я смог решить проблему, удалив сцену, а затем отменив удаление. Не изящно, но работало. Перед этим я сохранил свою раскадровку. Оглядываясь назад, я должен был сделать копию и сделать diffдо и после.


2
Как ни странно, это не работает постоянно. В моей безнадежной ситуации это сработало. Сейчас я тестирую его, и Source Codeпросмотр не показывает ошибку. Так что пробег может отличаться.
Дмитрий Миньковский

Я не нашел View Controller с этим, но я удалил его (в XML, не работал в ID), и предупреждение исчезло.
Дэниел

2

Для меня это было не из-за a Storyboard IDили a Segue. Я получил это предупреждение, потому что не установил View Controller's Custom Class.

Выберите View Controllerна Storyboard, затем в Utilities Pane, выберите Identity Inspectorзначок. Под Custom Class, увидеть , какое значение находится внутри Classполя.

Если он просто говорит UIViewController, вам нужно ввести имя класса. Это будет имя вашего .hи .mфайлов, составляющих пользовательский UIViewControllerподкласс.


У меня только что была вариация на этот счет. Я сопоставил не тот ViewController в моей раскадровке с классом ViewController и то же самое с идентификатором раскадровки.
Винс О'Салливан

2

Я пришел к этому вопросу сегодня. Я использую Xcode 6.3, и теперь ответ на вопрос OP довольно прост:

Выберите контроллер представления, который вы хотите сделать первым, покажите инспектор атрибутов и в разделе «Контроллер представления» убедитесь, что

Начальный контроллер представления

проверено. Вуаля!


2

С Xcode 7 с этим легко справиться. Нет необходимости вручную просматривать все сцены, чтобы найти проблемную. Сначала перейдите в навигатор отчетов , где вы можете получить более подробную информацию об известных проблемах. Описание проблемы может выглядеть так:

Base.lproj / Main.storyboard: fPh-fe-F5F : предупреждение: сцена недоступна из-за отсутствия точек входа и не имеет идентификатора для доступа во время выполнения через -instantiateViewControllerWithIdentifier :.

С помощью этой информации вы можете скопировать идентификатор объекта, в данном случае это был fPh-fe-F5F , и выполнить поиск в рабочей области для появления этой строки. Строка будет найдена в файле Main.storyboard. Дважды щелкните результат поиска, и откроется Main.storyboard с выбранной сценой. Как только вы узнаете проблемную сцену, вы можете легко решить проблему, установив идентификатор раскадровки или установив "Is Initial View Controller"


1

Вы можете просто установить идентификатор. В инспекторе атрибутов на правой панели вы найдете поле под названием «Идентификатор». Просто вставьте туда любую строку, это должно сработать

Вы можете щелкнуть контроллер навигации и в инспекторе атрибутов нажать кнопку «это начальный контроллер представления», и это тоже должно работать.


1
Мохаммад, спасибо за ответ, но проблема в том, на какой сцене я должен установить идентификатор? Я не могу найти сцену, вызывающую предупреждение, это основная проблема.
Wolfy

1

Я столкнулся с той же проблемой и решил, что для идентификатора раскадровки любой идентификатор для всех viewController и NavigationController также; ошибка будет немедленно удалена

наслаждаться!!!


0

Возможно, этот XQuery поможет вам найти эти неприятные сцены

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

Если у вас установлена ​​xqilla, вы должны сохранить запрос в файл и использовать его как

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

0

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


0

Я получил это предупреждение, когда у меня есть UIViewController в Storyboard, для которого ничего не установлено. Я избежал этого предупреждения, установив для него идентификатор раскадровки.


0

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


0

Все описанное выше перепробовал безрезультатно. У меня в ИБ все было подключено правильно, ровно с однимUIViewController назначен корневым контроллером представления. У меня не было идентификаторов, но я добавил их ко всем своим контроллерам.

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

Не уверен, какое действие исправило его или какая комбинация действий, но сама по себе это была не чистая сборка. Это может быть побочным продуктом того, что Main.storyboard всегда меняется после простого открытия, а это значит, что мне приходится делать это git commit -m "Stupid storyboard"чаще, чем я хочу.


0

Вот что у меня сработало:

  1. Откройте раскадровку в текстовом редакторе.
  2. Измените версию с 3.0 на 2.0, сохраните и закройте.
  3. Откройте его снова в визуальной студии. Он автоматически конвертирует и откроет документ.

0

У меня такая же ошибка: для меня ошибка заключалась в том, что я не инициировал контроллер представления в своей раскадровке.

Исправление удалило это предупреждение.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.