InterfaceBuilder - подкласс UIViewController не распознается как подкласс - PullRequest
2 голосов
/ 05 января 2009

Я работаю над простым приложением для 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) print-object 0x450d50 (ГБД)

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

EDIT1: Хорошо, похоже, что я не получал экземпляр подкласса, если в моем MainWindow.xib я явно не установил класс контроллера представления в свой подкласс.

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

EDIT2: (Ответ Кевину) Это не то, что я говорю относительно содержимого XIB.

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

MainWindow PeopleListView PeopleDetailView

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

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

EDIT3: (Кендаллу) Я не использую панель вкладок. Однако модель та же самая, что представление в моем контроллере навигации должно быть связано с одним подклассом, что выглядит немного странно.

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

Ответы [ 4 ]

4 голосов
/ 05 января 2009

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

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

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

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

0 голосов
/ 17 июля 2010

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

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

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

0 голосов
/ 05 января 2009

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

- (IBAction) methodName;

0 голосов
/ 05 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...