Раскадровка не содержит контроллера представления с идентификатором


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
Похоже, вы установили идентификатор перехода, а не контроллер представления. Какой контроллер представления на этом изображении вы пытаетесь представить? И почему ты просто не используешь переход?
— Firoze Lafeer

До Driving view controller работает хорошо .... чем когда я пытаюсь представить TableViewController я получаю ошибку ...... как бы вы это сделали?
— Мат

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

Ответы:


244

Просто для дальнейшего использования:

Я разрабатываю на iOS 6 с использованием раскадровки.

У меня возникла та же проблема, но я не смог найти поле «Идентификатор» в инспекторе. Вместо этого просто установите в поле «Storyboard ID» то, что вы бы назвали «Идентификатором». Это поле можно найти на вкладке «Показать инспектора идентификации» в Инспекторе.

[Примечание: комментарии ниже указывают на то, что некоторые люди обнаружили, что им нужно (также?) Установить поле «Идентификатор восстановления» чуть ниже идентификатора раскадровки в инспекторе. Нажатие на «Использовать идентификатор раскадровки» кажется недостаточным.]

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


24
до XCode 4.4 и ранее: Идентификатор; XCode 4.5: ID раскадровки
— ilmiacs

Спасибо за информацию. Мне было трудно найти идентификатор в раскадровке, следуя объяснениям в 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

Исправлена! В моем случае DrivingDetails должен быть установлен не только идентификатор в segue, но также и идентификатор в моем tableViewController как DrivingDetails ... проверьте мою картинку:

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

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

***** РЕДАКТИРОВАТЬ для XCODE 7.0 *****

Вы должны установить storyboardId (в этом случае viewController встроен в контроллер Navigation:

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

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


2
Я столкнулся с проблемой, схожей с этим вопросом, но когда я захожу в инспектор атрибутов, я не вижу 2 поля, как на вашем снимке экрана, только поле заголовка, поле идентификатора
— Anon957

Вы смотрели на ответ выше? Я думаю, что более обновленный. Спасибо
— Мат

1
Идентификатор segue не имеет к этому никакого отношения. Только раскадровка ID для контроллера представления должна быть установлена ​​в раскадровке.
— Jawwad

Возможно связано. В iOS7 [storyboard instantiateViewControllerWithIdentifier]НЕ создается экземпляры представлений из Интерфейсного Разработчика внутри контроллера представления; но в iOS6 это было
— Уильям Энтрикен

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

Примечание:

  • "StoryboardFileName"это имя файла раскадровки и не идентификатор раскадровки!
  • "StoryboardID"это идентификатор, который вы вручную установили в инспекторе идентичности для этой раскадровки (см. скриншот ниже).

ID раскадровки

Иногда люди считают, что первый - это Storyboard ID, а второй - имя класса View Controller, поэтому обратите внимание на разницу.


1
Это!! Мой человек, ты только что разгадал мою 18-часовую тайну. Спасибо за краткое объяснение.
— mrfevrier

1
Иисус Христос! Спасибо за это! .instantiateViewController(withIdentifier: "StoryboardID")следует переименовать в .instantiateStoryboard(withIdentifier: "StoryboardID")Или просто что-то попрощеUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
— Рузвельт

16

Удостоверение расположено на вкладке Identity Inspector с именем Storyboard ID для Xcode 6.3.2 и отмечено параметром Use Storyboard ID. введите описание изображения здесь


Это было проблемой все время, это работало в обоих местах, у меня были проблемы. Это не просто значение Storyboard ID, которое нужно установить, вам нужно проверить «Использовать Storyboard ID»
— Тайлер Хак

«Использовать Storyboard ID» был жизненно важной частью для меня. Спасибо.
— Марси

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 - тот, где вы устанавливаете имя вызова на этом экране, он говорит: «идентичность» - мой был скрыт, мне пришлось нажмите на слово identity, затем отобразится storyboardID - добавьте идентификатор из кода, готово


4

Изменение «Storyboard ID» в инспекторе идентичности (3-й значок слева) должно работать.

Если нет, и вы уверены, что опечаток нет, попробуйте очистить проект («Продукт» -> «Очистить» или просто команда + Shift + K).


спас мою жизнь. Спасибо. (особенно часть об уборке)
— Jay

1

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


какой контроллер просмотра мне выбрать? извини, я в замешательстве.
— Мат

TableViewController * controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "drivingDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] valueForKey: @ "name"]; [self.navigationController pushViewController: контроллер анимирован: ДА]; как это?
— Мат

В соответствии с изображением TableViewController должен быть выбран, как вы делаете для отображения деталей в этом контроллере.
— iamsult

Пошаговое объяснение раскадровки
— iamsult

1
Просто обратите внимание, что ваш идентификатор segue и идентификатор контроллера представления отличаются. Я просто хотел подчеркнуть, что в этом случае была некоторая путаница, поскольку вы используете одно и то же имя для обоих. Ваш идентификатор segue должен использоваться для prepareForSegue, а идентификатор контроллера представления предназначен для прямой загрузки представлений из вашей раскадровки. 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

Я получил ту же ошибку, и я мог это исправить, изменив следующие изменения в моем проекте. Я упомянул свое имя класса в панели инспектора, тогда проблема решена. Перейти-> правая панель там Identity Inspector В разделе пользовательских классов

class: ваше имя класса (ViewController)

В идентификаторе раскадровки раздела Identity: ваш идентификатор раскадровки (имя viewController)

После этого нажмите на опцию Использовать ID раскадровки там. На этом проблема закончена. Я надеюсь, что это поможет вам ....


0

Используйте свой идентификатор (@ "drivingDetails") в качестве идентификатора раскадровки.


0

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

здесь мой первый - это storyboardID let vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") как! tabBarViewController


0

Я перепробовал все вышеперечисленные решения, и ни одно из них не сработало.

То, что я сделал, было:

  • Проект чистый
  • Удалить производные данные
  • Перезапустите Xcode
  • Повторно введите StoryboardID, показанный в предыдущих ответах (внутри IB).

И тогда это сработало. Шокирующим было то, что я ввел Storyboar ID в конструкторе интерфейсов, и он был удален / удален после повторного открытия Xcode.

Надеюсь, это кому-нибудь поможет.


0

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

Мне пришлось удалить viewController и создать новый с новым идентификатором.


0

Примечание: если вы используете cocoapods в своем проекте, то сначала запустите pod deintegrateиrm Podfile.lock

Затем откройте папку вашего проекта в любом стороннем редакторе кода, таком как VSCode, и выполните глобальный поиск имени ViewController, выдав ошибку.

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

Теперь все должно работать нормально.

Это чаще всего происходит, когда вы переименовываете файлы из Xcode.


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