2015-05-02 4 views
0

В UIViewControllers, где я не использую .xib-файлы, я создавал свои элементы пользовательского интерфейса в методах viewDidLoad. Например,Где добавить объекты пользовательского интерфейса при программном создании пользовательского интерфейса (вместо .xib/раскадровки)

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Setup table 
    self.tableView=[[UITableView alloc] initWithFrame:self.view.frame]; 
    [self.tableView setDataSource:self]; 
    [self.tableView setDelegate:self]; 
    [self.view addSubview:self.tableView]; 

    // Setup custom cells 
    UINib *lessonNib=[UINib nibWithNibName:@"CustomCell" bundle:nil]; 
    [[self tableView] registerNib:lessonNib forCellReuseIdentifier:@"CustomCellID"]; 
} 

По большей части это прекрасно работает. Но, в процессе изучения ошибки, связанной с динамическими высотами ячеек, мне любопытно: это подходящее место для добавления элементов интерфейса?

Спасибо за чтение.

+2

это может быть подходящее место для их создания и добавления - НО это неправильное место для установки их макета, например. их кадров. – luk2302

+0

Привет @ luk2302, спасибо за комментарий. Для фреймов и других элементов компоновки это связано с тем, что еще не были установлены элементы макета в viewDidLoad (и поэтому мой 'self.view.frame' может быть пустым или иным образом бессмысленным)? Означает ли это, что «viewWillAppear» - самое раннее присвоенное место? – Rogare

+0

Почему viewDidLoad неверен для установки фреймов? Можете ли вы привести мне причины? : P –

ответ

2

Я бы сказал, что это подходящее место, да. Поскольку этот метод вызывается только один раз и вызывается, прежде чем что-либо из вашего представления будет показано на экране. И поэтому вы не рискуете создавать их дважды или даже чаще или слишком поздно.

Но ваш макет должен быть сделан в другом месте - в viewWillLayoutSubviews:

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

Вы также можете переписать соответствующий viewDidLayoutSubviews

Что касается Вашего комментария: да, информация макет еще не присутствует в viewDidLoad, self.view.frame, например, не гарантируется фактический кадр, на ваш взгляд, будет отображаться в позже. Более того, изменение какой-либо части кода может привести к тому, что ваш пользовательский интерфейс не будет реагировать, если вы установите их размер и положение только при загрузке.

Примечание: Настройка ваших подпрограмм по коду гораздо сложнее, чем просто их разработка в раскадровке - я бы очень рекомендовал, если у вас нет серьезных проблем с их использованием.

+0

«Вы должны переопределить этот метод только в том случае, если поведение подпрограммы на основе авторезистентности и ограничения не предлагает поведения, которое вы хотите», - поэтому вы не правы: P –

+0

Он не использует ограничения или автоматическое изменение размера - поэтому я вхожу в факт правильный. – luk2302

+0

это должно быть сделано в layoutSubviews, если у вас действительно есть что-то, что нужно окончательно настроить, поэтому я не согласен с тем, что параметр в viewDidLoad - это плохое место для этого :) –

Смежные вопросы