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" для "Контролер перегляду робочих місць". Коли я намагався побудувати, я отримав повідомлення про помилку, вказуючи на один із контролерів подання, що має дублікат імені. Відстежуючи речі, я виявив, що у мене є справжній копія контролера перегляду, складеного точно поверх його близнюка. Я підозрюю, що це був вирізаний і вставлений збиток в результаті експерименту з користувацьким інтерфейсом, який я не відмовився повністю.

У всякому разі, видалення непов’язаного близнюка вирішило мою проблему. Після цього я видалив усі імена ВК, оскільки на них немає посилання в коді.


3
Це трапилося і зі мною, але мені все одно довелося заповнити одне з багатьох порожніхStoryboard ID
П'єр де ЛЕСПІН

... тоді я вважаю, що @bobnoble - це правильна відповідь, яку слід позначити √
SwiftArchitect

139

У своїй розкадровці виберіть кожен контролер перегляду (червона стрілка на зображенні нижче) і подивіться на поле Ідентифікатор розкадрування (червоний овал). Жодне з полів ідентифікатора раскадровки не повинно бути порожнім. Коли ви знайдете таку, яка є, це винен.

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


6
Привіт @bobnoble, дякую за вашу відповідь. Одне питання: чому я повинен встановлювати ідентифікатор розкадровки для кожної сцени? Я не думаю, що це обов’язково, чи не так? Я знаю, що мені потрібно встановити ідентифікатор, якщо я хочу отримати програмний доступ до сцени, але що, якщо всі мої сцени пов’язані за допомогою сегментів? Або це просто хороша практика програмування?
Вулфі

@Wolfy - хороший момент, вам потрібно переглянути кожну, щоб переконатися, що вона має або ідентифікатор segue, або Storyboard.
bobnoble

2
Спробувавши це рішення, я зрозумів, що заповнення лише одного конкретного Storyboard IDвидалило попередження
П’єр де ЛЕСПІН

У мене було UINavigationControllerкілька, UIViewControllersі мені довелося встановити ідентифікатор для всіх, навіть я ніколи не називаю одного з них за допомогою ідентифікатора. Дійсно дратує, шукає помилку там, де нікого немає!
Алекс Сіо

Працює для мене. Хтось знає, чому це виникає? Здається дуже невідкритим - надана помилка ретроспективно дає мізерний підказку. Я отримав його після перетворення раскадровки на останню і найвищу - якщо зараз потрібен ідентифікатор раскадровки, це, звичайно, не було раніше, і автоконвертація не подбала про це.
Джош Саттерфілд

30

Я просто мав цю точну помилку з простим односценовим Storyboard, і все, що мені потрібно було зробити, щоб це виправити, - встановити прапорець "Є початковий контролер перегляду" для контролера 1 перегляду в Storyboard. Я підозрюю, що в цій ситуації Xcode використовував цей прапорець за замовчуванням, але більше не робить цього.

Поставте галочку внизу

                                     

Поставте прапорець біля одного з контролерів перегляду у вашій розкадровці, і ви повинні бути добре.


1
Дякую. Це все!
Eric Chen

20

Боюсь, вам доведеться пройти всі 30 з них і перевірити, чи є у них ідентифікатор розкадровки чи сеґу для цього контролера перегляду. Потрібно одне з двох, обидва також є варіантом.


5
Після того, як усі контролери перегляду мають свою назву чи ідентифікатор, повідомлення про помилку все ще може бути там. У цьому випадку очистіть виріб, і його вже не буде.
Рейнхард Меннер,

5
У моєму випадку чистого продукту було недостатньо, щоб позбутися повідомлення про помилку після того, як я виправив помилку. Він зник, коли я перезапустив Xcode. (Я не намагався закрити / знову відкрити проект. Можливо, це теж спрацювало.)
JulianSymes

Те саме для мене - зрештою вам потрібно зупинити та перезапустити xcode, щоб позбутися повідомлення про помилку.
MusiGenesis

8

Ця проблема може трапитися в одному з таких сценаріїв:

Випадок I: Якщо жодна сцена в раскадровці не позначена як "isInitialViewController" .

Виправлення: Визначте кореневий контролер подання та позначте його як "isInitialViewController" у вашому SB. У цьому випадку ідентифікатор раскадровки не є обов’язковим.

Справа II

Можливо, трапляються ситуації, коли вам не потрібно мати InitiViewController в раскадровці. Наприклад, при використанні кількох розкадрувань.

Виправлення: У таких випадках переконайтесь, що "ідентифікатор розкадровки" вказано правильно, і ви посилаєтесь на першу сцену, яка використовується в розкадровці, використовуючи цей ідентифікатор. Наприклад, наприклад:

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

У цьому випадку "ідентифікатор розкадровки" є обов'язковим.

Справа III

У вас підключений InitiViewController. Але все-таки ви отримуєте це попередження. Це пов’язано з тим, що деякі сцени в раскадровці можуть бути не пов’язані із «segue», а також вони не мають «ідентифікатора раскадровки» . Відскануйте свою розкадровку, подивіться, чи потрібна "секунда" . Підключіть сегу, якщо цього немає. Якщо segue не потрібен, переконайтеся, що вам потрібно вказати "ідентифікатор розкадровки" оскільки це єдиний спосіб передати сцену зі свого коду, як показано в прикладі коду вище.

Сподіваюся, це допомагає


СПРАВА III - допоміг мені. Дякую!
mrGott

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

6

Вам не потрібно встановлювати Storyboard IDдля всіх сцен абоUINavigationController

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

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

Ви можете побачити це на зображенні вище UINavigationController не пов’язане з мороком, воно було винуватцем цього попередження.

Просто надайте йому ID розкадрування, щоб видалити це попередження.


5

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


Це мені допомогло. Я використовую перевищення 7.1.1 Swift 2. Початковий StoryBoard МАЄ бути контролером кореневого перегляду.
Лукесіві

3

Найпростіший спосіб знайти сцену злочину:

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

(Це насправді загалом так - подвійне клацання будь-якої помилки, як правило, призводить до спливаючого вікна, що містить похибку в центрі - акуратний маленький фокус!)

Примітка: Іноді XCode неправильно видає цю помилку для сцени, яка є кореневим контролером подання контролера навігації (тобто початковим контролером подання). Просте виправлення дає цьому контролеру кореневого подання ідентифікатор Storyboard, компіляцію (помилка повинна зникнути), а потім видалення storyboardID (помилки більше немає).


Дякуємо за вашу підказку "Просте виправлення дає цьому контролеру кореневого подання ідентифікатор розкадровки". Це вирішило мою проблему. Що ж, мені потрібно надати `` ID розкадровки '' UINavigationController.
Mohd Haider

Це вказує мені на Сцену застосування з головним меню. Не можу вказати цей ідентифікатор раскадровки.
Даніель

2

Найпростіший спосіб дізнатись, який контролер або сцена викликає цю проблему, це:

  • Клацніть клавішу Ctrl .storyboardу панелі навігаторів проекту та виберіть Open As > Source Code. Це відкриє базовий XML розкадрування.
  • У цьому поданні попередження буде чітко пов’язане з рядком у XML, який стосується сцени злочину.

Зараз, у моєму випадку, попередження особливо дратувало, тому що "сцена злочину" мала ідентифікатор та назву! Я зміг усунути проблему, видаливши сцену, а потім скасувавши видалення. Не елегантно, але працювало. Перш ніж це зробити, я врятував свою розкадрування. Оглянувшись назад, я повинен був зробити копію і diffзробити попереднє.


2
Дивно, але це, здається, не працює постійно. У моїй відмовленій ситуації це спрацювало. Зараз я тестую його, і Source Codeподання не відображає помилку. Отже, пробіг може відрізнятися.
Дмитро Міньковський

Я не знайшов контролера перегляду з цим, але видалив (у XML не працював в ідентифікаторі), і попередження зникло.
Даніель

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, і те саме з ідентифікатором Storyboard.
Вінс О'Салліван,

2

Я сьогодні прийшов до цього питання. Я використовую Xcode 6.3, і відповідь на питання OP зараз досить проста:

Виберіть контролер перегляду, який ви хочете бути першим, покажіть інспектор атрибутів, і в розділі контролера перегляду переконайтеся, що

Є початковим контролером перегляду

перевіряється. Вуаля!


2

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

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

За допомогою цієї інформації ви можете скопіювати ідентифікатор об'єкта, в даному випадку це був fPh-fe-F5F , та шукати робочу область для появи цього рядка. Рядок буде знайдено у файлі Main.storyboard. Двічі клацніть на результат пошуку, і він відкриється Main.storyboard з обраною сценою. Дізнавшись про проблематичну сцену, ви можете легко вирішити проблему, встановивши ідентифікатор розкадровки або встановивши параметр "Є початковий контролер перегляду"


1

Ви можете просто встановити ідентифікатор. На інспекторі атрибутів на правій панелі ви знайдете поле "Ідентифікатор". Просто вставте туди будь-який рядок, це має спрацювати

Ви можете натиснути на контролер навігації, а під інспектором атрибутів натиснути кнопку "початковий контролер перегляду", і це теж повинно працювати.


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

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

Я отримав це попередження, коли у мене в Storyboard є UIViewController, для якого нічого не встановлено. Я уникнув цього попередження, встановивши для нього ID розкадрування.


0

У мене була та сама проблема, але я зрозумів, що використовую перегляд контейнера, і замість того, щоб видалити контролер подання за замовчуванням, я видалив його segue. Отже, це один із випадків, коли з’являється попередження, якщо за замовчуванням контролер подання подання контейнера не видаляється належним чином, коли він вам не потрібен.


0

Я спробував усе описане вище безрезультатно. У мене все було правильно підключено в IB, саме з одним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.