Правильное использование loadView и viewDidLoad с UIViewController без nibs/xibs
Когда я программирую без наконечника, у меня создается впечатление, что мне нужно вызвать loadView для инициализации моего представления, например:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nil bundle:nil];
if (self) {
// Custom initialization
[self loadView];
}
return self;
}
(Я установил nibNameOrNil = nil, так как не существует nib.)
Затем я создаю представление, например:
- (void) loadView {
self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];
[self viewDidLoad];
}
Это делает все остальное в viewDidLoad.
Я все еще не уверен, что я должен делать вызовы loadView и viewDidLoad таким образом. Они не получаются автоматически.
Что сбивает с толку в документации для ссылки на класс UIViewController:
loadView Discussion
Вы никогда не должны вызывать этот метод напрямую.. этот метод, когда запрашивается свойство view, но в настоящее время равно нулю. Если вы создаете свои представления вручную, вы должны переопределить этот метод и используйте его, чтобы создать свои представления. Если вы используете Interface Builder для создания ваши представления и инициализировать контроллер представления, то есть вы инициализируете представление с использованием метода initWithNibName: bundle: установите nibName и nibBundle напрямую, или создать как ваши представления, так и представление контроллер в Interface Builder - тогда вы не должны переопределять этот Метод.
Итак, я не понимаю, как loadView вызывается, если я никогда не буду называть его напрямую.
По умолчанию этот метод ищет действительный nib информацию и использует эту информацию для загрузки связанного файла nib. Если информация о nib не указана, реализация по умолчанию создает простой объект UIView и делает его основным.
Я не понимаю, как это работает - создание боли UIView.
Если вы переопределите этот метод, чтобы вручную создавать свои представления, вы должны сделать это и назначить корневой вид вашей иерархии просмотреть свойство. (Создаваемые вами представления должны быть уникальными экземплярами и не должны использоваться совместно с каким-либо другим объектом контроллера вида.) Ваш пользовательская реализация этого метода не должна быть вызвана супер.
Если вы хотите выполнить любую дополнительную инициализацию своих просмотров, сделайте поэтому в методе viewDidLoad. В iOS 3.0 и более поздних версиях переопределить метод viewDidUnload, чтобы освободить любые ссылки на просмотра или его содержимого.
Хорошо, пока он не говорит, как вызывается viewDidLoad. Итак, для viewDidLoad:
viewDidLoad Обсуждение
Этот метод называется после того, как контроллер представления загрузил его связанные представления в память. Этот метод называется независимо. независимо от того, хранятся ли представления в файле nib или созданы программно в методе loadView. Этот метод чаще всего используется для выполнения дополнительных шагов инициализации для представлений, которые загруженные из файлов nib.
Вызывается тем, что?
Поскольку эти методы автоматически не вызываются в моем коде, мне остается думать, что я должен сам их называть. Но я до сих пор не понимаю четкого понимания документации, что это правильная вещь.
Ответы
Ответ 1
Как говорится в документации, вы не должны сами называть эти методы.
Как это должно работать, так это то, что код UIKit вызовет ваш метод loadView, если и когда ему действительно нужно представить иерархию представления контроллера на экране.
В частности, если какой-либо код пытается прочитать ваше свойство view
на вашем контроллере представления, а это свойство равно нулю, тогда код UIViewController вызовет метод loadView
. Если вы не реализуете loadView
самостоятельно, то реализация по умолчанию вернется к попытке загрузить иерархию представлений из nib.
Это происходит автоматически, когда вы пытаетесь представить свой контроллер просмотра, а представление - нулевое. (Это может произойти несколько раз, пока приложение работает, если ваш контроллер просмотра должен выгрузить свое представление в ответ на давление памяти, другое поведение, которое вы получаете за "свободный" и которое вы не хотите называть себя).
Если эти методы не вызывают в вашем контроллере представления, то должно быть что-то не так, как вы представляете этот контроллер представления, что мешает коду фреймворка в UIViewController вызывать эти методы. Опубликуйте этот код, и кто-то может помочь вам понять эту ошибку.
Прежде чем пытаться исправить ошибку ,, вы должны удалить их из своего кода:
[self loadView]
[self viewDidLoad]
И затем в вашей собственной реализации viewDidLoad
вам нужно будет вызвать реализацию суперкласса с помощью [super viewDidLoad]
Помните, что в loadView
ваша единственная ответственность за установку self.view в допустимый вид. Это. Код UIKit затем увидит это и вызовет viewDidLoad
для вас.
Надеюсь, что это поможет.
Ответ 2
Ответ Firoze Lafeer верен, я просто хочу показать, как принудительно загрузить свойство представления правильный путь:
(void)self.view;
Вы не должны этого делать! Если вам нужно, вы делаете что-то неправильно, но не вызывайте -loadView
и -viewDidLoad
самостоятельно при любых обстоятельствах.