Розкладочна панель не містить контролер перегляду з ідентифікатором


175

Я продовжую отримувати таку помилку:

Storyboard (<UIStoryboard: 0x7ebdd20>) doesn't contain a view controller with identifier 'drivingDetails'

Це код:

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   UIViewController *controller =  [self.storyboard instantiateViewControllerWithIdentifier:@"drivingDetails"];
   controller.title = [[dao libraryItemAtIndex:indexPath.row] valueForKey:@"name"];
   [self.navigationController pushViewController:controller animated:YES];
}

Я вже встановив identifierна UIStoryboardале я все ще отримую цю помилку.

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



4
Схоже, ви встановили ідентифікатор segue, а не контролер перегляду. Який контролер подання зображень на цій фотографії ви намагаєтеся представити? І чому ти просто не використовуєш segue?
Firoze Lafeer

До контролера перегляду водіння працює добре .... ніж тоді, коли я намагаюся представити TableViewController, я отримую помилку ...... як би ви це зробили?
Мат

Перейдіть на сторінку сповіщення, вийміть ідентифікатор розкадрування та додайте знову. Іноді потрібно очищати збірку папок та отримані дані
onmyway133,

Відповіді:


244

Тільки для подальшої довідки:

Я розробляюсь на iOS 6 за допомогою Storyboards.

У мене виникло те саме питання, але я не зміг знайти поле "Ідентифікатор" у інспектора. Замість цього просто встановіть поле під назвою "Ідентифікатор розгортки" на те, що б ви назвали Ідентифікатор. Це поле можна знайти на вкладці "Показати особу інспектора" у інспектора.

[Примітка - коментарі нижче вказують на те, що деякі люди виявили, що їм потрібно (також?) Встановити поле "Ідентифікатор відновлення" трохи нижче ідентифікатора дошки розгортки у інспектора. Якщо натиснути "Використовувати ідентифікатор розкадрування", здається, недостатньо.]

Нижче наведено зображення для довідки: (у цьому випадку я назвав свій ідентифікатор таким же, як і у мого класу) введіть тут опис зображення


24
до XCode 4.4 та новіших версій: Ідентифікатор; XCode 4.5: ID
розгортки

Дякуємо за вашу інформацію. У мене виникли проблеми з пошуком ідентифікатора в розгортці за поясненнями в Google, але я не зміг знайти ідентифікатор у Xcode4.6. це велике питання для новачків. Дякую.
початківці

4
Те, що працювало для мене, - це використовувати ReuseIndentifier. Ідентифікатор розкадрування все ще викликає нульовий виняток вказівника.
Дроїд Кріс

Той самий випадок тут @DroidChris
Ахмед

5
чек на "Використовувати ідентифікатор розкадрування" зробив мене щасливим
preetam

189

У Xcode 7 - 11 ,

коли ви змінюєте ідентифікатори розкадрівки і отримуєте подібні помилки,

просто ЧИСТІТЬ свій проект ( CMD+ SHIFT+ K)


13
Чому я завжди забуваю це робити? Це виправляє найсумніші проблеми. Дякую, Теде, що ти нагадав мені!
AlphaCodaSeven

2
Ця проблема виникла в XCode 7.2 під час витягування з репо, де VC в дошці даних було призначено ідентифікатор. Очищення проекту, здавалося, вирішило проблему.
Ед Джордж

2
Я думав, що втрачаю розум ... простий сег не працював, це робило трюк.
dokun1

2
Так, це працює !!!! деякий час Прибирання проекту xcode видалить небажане посилання на проект
kiran

3
Я приїжджаю з Android Studio та розробки Android. Це божевільно, скільки хаків потрібно використовувати в XCode та Swift. Мені справді треба плакати. Серйозно.
ktamas

43

Виправлено! Потрібно встановити не тільки ідентифікатор в segue, в моєму випадку DrivingDetails, але і ідентифікатор у моїй таблиціViewController повинен бути встановлений як DrivingDetails ... перевірити мою картинку:

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

Я також видалив контролер перегляду навігації, тому тепер два контролери подання таблиці з'єднані безпосередньо з анімацією "push".

***** редагувати для XCODE 7.0 *****

ви повинні встановити storyboardId (у цьому випадку viewController вбудований у контролер навігації:

let lastMinVc  = mainStoryBoard.instantiateViewControllerWithIdentifier("lastMinuteNavController") as! UINavigationController

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


2
У мене виникає подібна проблема з цим питанням, але коли я переходжу до інспектора атрибутів, я не бачу 2 полів, як на екрані, знімають лише поле заголовка, а не поле ідентифікатора
Anon957

Ви подивилися на відповідь вище? Думаю, оновлено більше. Спасибі
мат

1
Ідентифікатор segue не має нічого спільного з цим. У дошці даних потрібно встановити лише ідентифікатор аркуша розкадрування для контролера перегляду.
Jawwad

Можливо, пов'язані. В iOS7 [storyboard instantiateViewControllerWithIdentifier]НЕ створюється подання поглядів від Interface Builder всередині контролера перегляду; але в iOS6 це було
Вільям Ентрікен

30
let storyboard = UIStoryboard(name: "StoryboardFileName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "StoryboardID")
self.present(controller, animated: true, completion: nil)

Примітка:

  • "StoryboardFileName"- це ім'я файлів розгортки, а не ідентифікатор розгортки!
  • "StoryboardID"- це ідентифікатор, який ви вручну встановили в інспекторі особи для цієї дошки (див. знімок екрана нижче).

Ідентифікатор розгортки

Іноді люди вважають, що перший - це ідентифікатор розгортки, а другий - назва класу View Controller, тому відзначте різницю.


1
Це !! Мій чоловік, ти щойно розгадав мою 18-годинну таємницю. Дякую за стисле пояснення.
mrfevrier

1
Ісус Христос! Дякую за це! .instantiateViewController(withIdentifier: "StoryboardID")має бути перейменовано на .instantiateStoryboard(withIdentifier: "StoryboardID")Or просто щось простішеUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
roosevelt

16

Ідентифікатор розміщений на вкладці «Інспектор ідентичності» під назвою «Ідентифікатор розгортки» для Xcode 6.3.2 та встановлений прапорець Використовувати параметр «Ідентифікатор розгортки». введіть тут опис зображення


Це була ця проблема протягом усього часу, це працювало в обох місцях, у мене були проблеми. Встановлено не лише значення ідентифікатора розкадрування, вам потрібно перевірити "Використовувати ідентифікатор розкадрування"
Tyler Hack

"Використовувати ідентифікатор розкадрування" був життєво важливим для мене твором. Дякую.
Марсі

9

Якраз виникло це питання після додавання нового ПК на розкладову, але лише на пристрої, а не на тренажері. Виявляється, це було пов'язано з наявністю декількох локалізацій розкадровки - VC додано лише до первинної. Я спробував видалити інші локалізації (одну з яких використовує мій iPhone), але все ж сталася помилка. Врешті-решт мені довелося відтворити інші локалізації з новим VC у кожній з них.


5

Компілятор показує таку помилку:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Storyboard (<UIStoryboard: 0x7fedf2d5c9a0>) doesn't contain a 
ViewController with identifier 'SBAddEmployeeVC''

Тут об'єктом створеної раскадровки є не головна табло, яка містить наші ViewControllers. Як розкадровки файл , на якому ми працюємо названий Main.storyboard . Тому нам потрібно мати посилання на об'єкт Main.storyboard .

Для цього використовуйте наступний код:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

Ось storyboardWithNameназва файлу розкадровки, з яким ми працюємо, і bundleвказує пакет, у якому знаходиться наша дошка (тобто mainBundle).


5

Для тих, хто має ту саму проблему, що і @Ravi Bhanushali, ось рішення Swift 4:

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)


До цього слід додати коментар до відповіді @Ravi.
Суніль

Я мав би, але не маю репутації. Хтось із достатньою репутацією бажає цього зробити
confitz20

4

Я знайшов це ... натисніть на контролер перегляду в табло, натисніть третю піктограму зліва на інспекторах атрибутів vc - той, де ви вказали ім'я виклику на цьому екрані, він говорить "особистість" - моя була прихована, я повинен був клацніть на ідентичність слова, потім він показує storyboardID - додайте ідентифікатор з коду, зроблено


4

Змінення "Ідентифікатора розкадрування" у інспектора посвідчення особи (третя піктограма зліва) повинна працювати.

Якщо ні, і ви впевнені, що немає помилки, спробуйте очистити проект ("Продукт" -> "Очистити" або просто командуйте + shift + K).


врятувало мені життя. Дякую. (особливо частина про прибирання)
Джей

1

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


який контролер перегляду я повинен вибрати? вибачте, я розгублений
Мат

TableViewController * Controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "driveDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] значенняForKey: @ "ім'я"]; [self.navigationController pushViewController: анімований контролер: ТАК]; подобається це?
Мат

Відповідно до зображення TableViewController слід вибирати так, як ви робите для відображення деталей у цьому контролері.
iamsult

Покрокове пояснення дошки історії, надане raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1
iamsult

1
Лише трохи зауважте, що ваш ідентифікатор Segue та ідентифікатор контролера перегляду різні. Я просто хотів підкреслити, що на випадок виникла певна плутанина, оскільки ви використовуєте те саме ім’я для обох. Ваш ідентифікатор segue повинен бути використаний у підготовціForSegue, а ваш ідентифікатор контролера перегляду призначений для завантаження переглядів з вашої дошки розкадрувань. scott-sherwood.com/?p=219
Скотт Шервуд

1

Кілька моїх контролерів перегляду бракували атрибуту storyboardIdentifier .

Перед:

<viewController
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

Після:

<viewController
    storyboardIdentifier="YourViewControllerName"   <----
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

0

У мене виникла така ж помилка, і я можу це виправити, змінивши наступні зміни у своєму проекті. Я назвав своє ім'я класу на панелі інспекторів, тоді проблема вирішена. Перейдіть на праву панель, там - інспектор ідентичності

class: назва вашого класу (ViewController)

У розділі Ідентифікатор ідентифікатора розділу розділу: ваш ідентифікаційний аркуш (viewController Name)

Після цього натисніть на пункт Використовувати ідентифікатор раскадровки. Тут проблема закінчена. Сподіваюся, це допоможе тобі….


0

Використовуйте свій ідентифікатор (@ "vožnjeDetails") як ідентифікатор дошки.


0

дуже просто вибрати відповідний контролер перегляду на головній дошці повідомлень і перевірити, що його використовує його в ідентифікаторі дати ім'я та використовувати його.

тут мій кам'яний камінь - це storyboardID, нехай vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") як! tabBarViewController


0

Я спробував усі вищезазначені рішення, і жоден не спрацював.

Що я зробив:

  • Проект чистий
  • Видалити отримані дані
  • Перезавантажте Xcode
  • Повторно введіть StoryboardID, показаний у попередніх відповідях (всередині ІБ).

І тоді це спрацювало. Шокуюча річ полягала в тому, що я ввів ідентифікатор Storyboar в конструктор інтерфейсів, і його видалили / видалили після відкриття Xcode знову.

Сподіваюся, що це комусь допоможе.


0

Очищення всіх речей та закриття Xcode не вирішило проблему для мене.

Мені довелося видалити viewController і створити новий з новим ідентифікатором.


0

Примітка. Якщо ви використовуєте кокаоподи у своєму проекті, спочатку запустіть pod deintegrateіrm Podfile.lock

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

  1. Перейменуйте / виправте неправильні імена, які ви знайдете.
  2. Збережіть усі зміни.
  3. Очистіть і складіть свій проект.

Зараз все повинно працювати нормально.

Найчастіше це виникає під час перейменування файлів із Xcode.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.