Не лучше ли создать иерархию подпредставлений в -viewDidLoad, а не в -loadView? - PullRequest
2 голосов
/ 16 июня 2010

Документы говорят, что вся иерархия подпредставлений может быть создана в -loadView.Но есть также метод -viewDidLoad, который неплохо переписать для фактического построения иерархии при загрузке представления.Я думаю, это вопрос вкуса.Но, может быть, делать это в -viewDidLoad имеет преимущество в том, что контроллер представления уже корректно настроил рамку представления, чтобы приспособить ее для строки состояния или любого другого типа панели, например панели вкладок или панели инструментов?

Ответы [ 2 ]

3 голосов
/ 16 июня 2010

viewDidLoad называется после построена иерархия представлений.Предполагается, что loadView строит иерархию и устанавливает свойство view, если вы не загружаете из файла NIB.

viewDidLoad также вызывается после предупреждения памяти, если вы просматриваете, выгружено.Когда вы получаете предупреждение памяти, вызывается viewDidUnload, чтобы дать вам возможность освободить объекты, которые могут быть легко воссозданы в viewDidLoad.

Прочтите разделы «Примечания по подклассам» и «Управление памятью» описания класса , чтобы лучше понять, как он работает.

2 голосов
/ 16 июня 2010

Я думаю, что логика заключается в том, что в loadView вы создаете элементы, то есть создаете и распределяете память, что является наиболее дорогостоящим действием.Поэтому, когда [super loadView] был вызван полностью вверх по лестнице, все виды готовы к отображению, и дорогая часть закончена.

В - (void) viewDidLoad вы заполняете представления данными, viewDidLoad "знает"все элементы готовы к тому, чтобы на них был установлен текст, значения, содержимое и т. д.

UINavigationControllers и т. д. может быть полезно знать, когда все готово, чтобы начать анимацию просмотра на экране.Если вы помещаете все экземпляры / выделения в viewDidLoad, вы заставляете контроллер делать все, включая анимацию на экране, в последний момент.Я не знаю точных деталей, но это то, что я получаю из документации и «жизненного цикла» UIViewController

Я обычно делаю это так:

- (void)loadView {

    [super loadView];

    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 20.0f, 320.0f, 460.0f)];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg02.png"]];
    [container addSubview:imageView];
    [imageView release];

    UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg_search.png"]];
    [container addSubview:background];
    [background release];

    UILabel *textlabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 200.0f, 20.0f)];
    [self setLabel:textlabel];
    [container addSubview:self.label];
    [textlabel release];

    [self setView:container];
    [container release];
}

- (void)viewDidLoad {

    [self.label setText:@"I am ready!"];
    [super viewDidLoad];
}

Я иногда использую viewWillAppear для установки данных, если это контроллер представления, который поддерживает modalViewControllers или выдвигает новый viewController, где пользователь устанавливает данные, которые должны быть обновлены на родительском элементе при повторном извлечении представления (например, UITableViewController со списком песенКогда пользователь нажимает, пользователь выбирает песню, и на контроллерах появляется, и родительский элемент теперь отображает название песни, которое выбрал пользователь и т. д.) В любом случае, когда представление часто включается / выключается на экране, но должно отображать вновь измененные данные.

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