iPhone SDK: в чем разница между loadView и viewDidLoad?

При работе с представлениями и controllerами представлений в приложении для iPhone можно ли объяснить разницу между loadView и viewDidLoad?

Мой личный контекст заключается в том, что я строю все свои представления из кода, я не использую и не буду использовать Interface Builder, если это имеет значение.

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

Благодаря!

Я могу догадаться, что может быть проблемой здесь, потому что я сделал это:

Я обнаружил, что часто, когда я добавляю init-код для loadView, я получаю бесконечную трассировку стека

Не читайте self.view в -loadView. Только установите его, не понимайте .

Аксессуар свойства self.view вызывает -loadView, если представление в настоящее время не загружено. Ваша бесконечная recursion.

Обычный способ создания представления программно в -loadView, как показано в примерах Apple для предварительного интерфейса-Builder, выглядит примерно так:

UIView *view = [[UIView alloc] init...]; ... [view addSubview:whatever]; [view addSubview:whatever2]; ... self.view = view; [view release]; 

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

loadView – это метод в UIViewController , который фактически загрузит представление и назначит его свойству view . Это также местоположение, в котором подclass UIViewController будет переопределяться, если вы хотите программно настроить свойство view .

viewDidLoad – это метод, который вызывается после загрузки представления. Это вызывается после вызова loadView. Это место, где вы можете переопределить и вставить код, который делает дальнейшую первоначальную настройку представления после его загрузки.

 viewDidLoad() 

должен использоваться, когда вы загружаете свое представление из NIB и хотите выполнить любую настройку после запуска

 LoadView() 

должен использоваться, когда вы хотите создать свой вид программно (без использования Interface Builder)

Просто добавив некоторые примеры кода, чтобы продемонстрировать, что сказал NilObject:

 - (void)loadView { // create and configure the table view myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped]; myTableView.delegate = self; myTableView.dataSource = self; myTableView.scrollEnabled = NO; self.view = myTableView; self.view.autoresizesSubviews = YES; } - (void)viewDidLoad { self.title = @"Create group"; // Right menu bar button is to Save UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)]; self.navigationItem.rightBarButtonItem = saveButtonItem; [saveButtonItem release]; } 

Чтобы предотвратить бесконечный цикл, когда вы читаете self.view, вызывайте супер-реализацию classа при загрузке представления. Супер-реализация выделит вам новый UIView.

 - (void) loadView { [super loadview]; // init code here... [self.view addSubView:mySubview1]; //etc.. } 

Самый простой способ использования loadView – создать некоторый тип controllerа базового представления, например MyBaseViewController, который является подclassом UIViewController. В этом методе loadView создайте представление таким образом:

 -(void) loadView { if ([self viewFromNib]) { self.view = [self viewFromNib]; } else { self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; } self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.view.backgroundColor = [UIColor whiteColor]; } 

И когда вам нужно создать какой-либо controller вида, вы просто используете подclass MyBaseViewController, а в его controllerе loadView вы просто вызываете [super loadView], как это

 //sucblass loadView -(void) loadView { [super loadView]; //rest of code like this.. UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame]; [self.view addSubview:myLabel]; [myLabel release]; } 

loadView() вызывается, когда вашему controllerу предлагается создать его self.view . Вы можете сделать это сами, как

 self.view = [UIView alloc] init...]; 

Или у родительского classа UIController вашего controllerа уже есть имя метода -loadView() которое инициализирует ваш self.view в пустой вид. Затем вы можете позвонить

 [super loadView]; 

Я действительно рекомендую второй подход, поскольку он поощряет наследование. Только если ваш controller просмотра напрямую не унаследован от UIViewController.

  • Как отобразить изображение base64 в UIImageView?
  • iphone error: expected '=', ',', ';', 'asm' или '__attribute__' перед '' foo '
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • Как получить подстроку NSString?
  • UISwitch в ячейке UITableView
  • Замена на устаревший размерWithFont: в iOS 7?
  • UITextView внутри UIScrollView с AutoLayout
  • Представление controllerа модального вида сразу после отклонения другого
  • Когда вы делаете подчеркивание перед переменной экземпляра?
  • Работает ли UIGestureRecognizer на UIWebView?
  • Точка с запятой после имени метода в файле реализации Objective-C
  • Давайте будем гением компьютера.