Подтвердить что ты не робот

Правильное использование 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.

Вызывается тем, что?

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

4b9b3361

Ответ 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 самостоятельно при любых обстоятельствах.