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

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+ сцен).

Любые предложения?

Screenshot for warning

Ответ 1

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

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

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

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

Ответ 2

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

enter image description here

Ответ 3

У меня просто была эта точная ошибка с простой односкатной раскадрой, и все, что я должен был сделать, чтобы исправить, - это установить флажок "Исходный контроллер просмотра" для 1 контроллера вида в раскадровке. Я подозреваю, что Xcode использовал этот флажок для вас по умолчанию в этой ситуации, но больше не делает.

Check the box at the bottom

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

Ответ 4

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

Ответ 5

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

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

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

Случай II

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

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

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

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

Дело III

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

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

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

Контроллер начального просмотра

. Вуаля!

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

i столкнулся с такой же проблемой и решил с помощью идентификатора раскадровки указать любой идентификатор для всех viewController и NavigationController; ошибка будет немедленно удалена.

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

Ответ 15

Возможно, этот 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>

Ответ 16

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

Ответ 17

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

Ответ 18

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

Ответ 19

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

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

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

Ответ 20

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

  • Откройте раскадровку в текстовом редакторе.
  • Измените версию с 3.0 на 2.0 и сохраните ее.
  • Откройте его в визуальной студии. Он автоматически преобразует и открывает документ.

Ответ 21

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

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

Ответ 22

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