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


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.