Как добавить пользовательский интерфейс для одного из контроллеров вкладок, используя loadView, когда остальные были через Interface Builder? - PullRequest
0 голосов
/ 29 июля 2011

У меня есть главное окно, в котором UITabViewController является корневым контроллером. Я использую файл пера для этого. В Интерфейсном Разработчике две из вкладок были связаны с Controller_A, Nib_A и Controller_B, Nib_B, но 3-я вкладка знает только о Controller_C.

Я предполагал, что это будет означать, что метод loadView для Controller_C будет вызываться автоматически, поскольку я не удосужился указать файл NIB. Я хочу выложить эту часть программно. И это действительно вызывается, как я подтвердил, поместив точку останова внутри этого метода.

НО, когда я переключился на Controller_C в симуляторе, он появляется пустым!

Вот как выглядит loadView Controller_C:

- (void)loadView
{
    [super loadView];
    ...
    [self setTableView:formTableView];
    [view addSubview:formTableView];
    [self setView:view];
}

Какие-нибудь советы? Что я игнорирую?

Ответы [ 3 ]

0 голосов
/ 29 июля 2011

Вот основные вещи, которые нужно проверить.

  1. Нажмите на свой Controller_C в конструкторе интерфейсов. В Identity Inspector убедитесь, что в поле Class установлено значение Controller_C.
  2. В инспекторе атрибутов убедитесь, что поле NIB Name не заполнено.
  3. Если в вашем проекте есть существующий файл Controller_C.xib, удалите и удалите его. Реализация loadView по умолчанию загружает этот файл, даже если
  4. Удалить [super loadView]. Поскольку вы строите свою иерархию представлений в коде, вы не должны вызывать реализацию по умолчанию. Вы должны явно выделить представление контроллера как локальную переменную в loadView и установить его, используя setView:.

Кроме того, ваш комментарий к другому ответу наводит на мысль, что вы можете быть смущены тем, когда / почему звонят loadView и initWithNibName:bundle:, поэтому позвольте мне уточнить:

loadView вызывается для отложенной загрузки представления вашего контроллера при первом обращении к его свойству view. Это верно, независимо от того, был ли ваш контроллер вида создан как объект в NIB, или вы создали его самостоятельно в коде, используя initWithNibName:bundle:. Реализация по умолчанию loadView загружает NIB, указанный в initWithNibName:bundle: или в свойстве NIB Name в IB. Если имя NIB не было указано, реализация по умолчанию ищет любой NIB в пакете, имя которого совпадает с именем вашего класса, и загружает этот NIB, если он найден. Если соответствующий NIB не найден, то реализация по умолчанию loadView просто создает пустое представление и устанавливает его в качестве представления вашего контроллера. Когда мы явно строим нашу собственную иерархию представлений в loadView, нам не нужно ни одно из этих поведений по умолчанию, поэтому мы не вызываем [super loadView].

0 голосов
/ 30 июля 2011

Кажется, что loadView работает, как и ожидалось, потому что мое представление было пустым, потому что источником данных для моего табличного представления был фактически NIL.Ранее я не рассматривал этот сценарий, так как думал, что в таком случае он, по крайней мере, будет представлять собой пустую таблицу, но, очевидно, это было неверное предположение с моей стороны.Все это по ошибке привело меня к мысли, что представление не было инициализировано должным образом.

@ cduhn: Спасибо, я уже выполнял шаги 1-3, и было очень приятно услышать, что кто-то другой дал такой же совет,Все остальное, что ты сказал, было для меня также познавательно.

Спасибо всем.

0 голосов
/ 29 июля 2011

Похоже, вы ищете:

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