InterfaceBuilder - подкласс UIViewController не распознан как подкласс

StackOverflow https://stackoverflow.com/questions/412083

  •  03-07-2019
  •  | 
  •  

Вопрос

Я работаю над простым приложением для iPhone.

У меня есть 1 UINavigationController и 2 подкласса UIViewController.

У меня есть файл MainWindow.xib, PersonListView.xib и PersonDetailView.xib.

MainWindow.xib содержит UINavigationController с представлением, связанным с файлом PersonListView.xib.

В PersonListView.xib владелец файла указан как класс PersonListViewController.

У меня есть несколько кнопок в PersonListView, а также ярлыки и изображения.Все отображается корректно.

Когда я пытаюсь связать кнопку в PersonListView с моим классом PersonListViewController, кнопка не срабатывает....

Результат: * Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина:'* -[UIViewController ViewDetail Просмотр данных]:нераспознанный селектор, отправленный экземпляру 0x450d50'

Если я захожу в консоль отладки и печатаю объект 0x450d50, я получаю:

(gdb) объект печати 0x450d50 (gdb)

Конструктор интерфейса правильно показывает Владельца файла как PersonListViewController , так почему же мое действие кнопки (связанное с владельцем файла) каким-то образом переходит в суперкласс?

РЕДАКТИРОВАТЬ 1:Хорошо, похоже, что происходит то, что я не получал экземпляр подкласса, если только в моем MainWindow.xib я явно не установил класс контроллера представления в свой подкласс.

Тем не менее, все еще должно быть что-то, чего мне не хватает, потому что, конечно же, я должен иметь возможность запускать произвольные подклассы UIViewController, просто заменив имя файла NIB из главного окна?

РЕДАКТИРОВАТЬ 2:(Ответ Кевину) Это не то, что я говорю относительно содержимого XIB.

У меня есть 3 XIBs:

Главное окно Просмотр списка пользователей Просмотр списка пользователей

У каждого PeopleListView и PeopleDetailView есть Владелец связанного файла, который является соответствующим подклассом UIViewController.Очевидно, мне нужно, чтобы мои события переходили к нужным классам контроллеров при переходе со страницы на страницу...но если я могу использовать только UIViewController по умолчанию или один подкласс, это будет намного сложнее?

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

РЕДАКТИРОВАТЬ 3:(обращаясь к Кендаллу) Я не использую панель вкладок.Однако модель та же, что и представление в моем навигационном контроллере, должно быть подключено к одному подклассу, что кажется немного неприглядным.

РЕДАКТИРОВАТЬ 4:(для lostintransit) PersonListViewController имеет соответствующий ViewDetail - (IBAction) ViewDetail;способ.Проблема в том, что я не могу найти способ в моем MainWindow.xib пометить представление внутри моего UINavigationController как "первоначально загрузить это из PersonListView.xib с PersonListViewController в качестве представления", что не затруднило бы замену PersonListView на PersonDetailView .

Это было полезно?

Решение

Я думаю, вы используете панель вкладок, верно?

Если это так, подумайте об этом с другой стороны.Каждая вкладка, определенная в MainWindow xib, должна быть определена как тип пользовательского контроллера представления, поскольку именно этот тип будет создан панелью вкладок при ее загрузке.Панель вкладок создает контроллеры представления для каждой вкладки, определенной при ее загрузке.

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

Таким образом, убедитесь, что для каждого контроллера представления, определенного на каждой вкладке в MainWindow.xib (используйте древовидное представление в IB для проверки этого), установлен правильный пользовательский тип UIViewController в дополнение к указанию на ваш пользовательский XIB, для владельца файла которого также должен быть установлен правильный тип (хотя это важно только в том случае, если вы подключаете что-либо к владельцу файлов за пределами базового представления).

Другие советы

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

Из исключения следует, что привязка не была выполнена должным образом.Сигнатура метода, похоже, неверна, судя по исключению.Связано ли действие кнопки с методом с возвращаемым типом IBAction?Сигнатура метода должна быть

-(IBAction) имя_меТода;

Я допустил ту же ошибку.

Проблема в том, что вы не установили цель PersonListViewController.m.

Перейдите к информации PersonListViewController.m, выберите раздел targets и убедитесь, что цель вашего приложения отмечена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top