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 по умолчанию ставил для вас этот флажок, но больше не делает этого.

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

                                     

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

w0mbat
источник
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 подключен. Но все же вы получаете это предупреждение. Это связано с тем, что некоторые сцены в раскадровке могут не быть связаны с «переходом», а также у них нет «идентификатора раскадровки» . Просмотрите свою раскадровку, посмотрите, нужен ли «переход» . Подключите переходник, если он отсутствует. Если переход не требуется, убедитесь, что вам нужно указать «идентификатор раскадровки», поскольку это единственный способ ссылаться на сцену из вашего кода, как показано в примере кода выше.

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

шах1988
источник
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 неверно выдает эту ошибку для сцены, которая является корневым контроллером представления контроллера навигации (то есть начальным контроллером представления). Простое исправление - присвоение этому корневому контроллеру представления идентификатора раскадровки, компиляция (ошибка должна исчезнуть), а затем удаление идентификатора раскадровки (ошибки больше нет).

ajay14
источник
Спасибо за подсказку: «Простое исправление дает этому корневому контроллеру представления идентификатор раскадровки». Это решило мою проблему. Что ж, мне нужно присвоить «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подкласс.

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

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

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

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

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

Zonker.in. Женева
источник
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

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

miken.mkndev
источник
0

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

Дурга Вундавалли
источник
0

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

глубокий
источник
0

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

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

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

Корвин Ньюолл
источник
0

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

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

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

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

Ветри Селви Вайрамуту
источник
0

Просто предоставление всем MVC идентификатора раскадровки сработало для меня.

Элия ​​Дёлер
источник