viewDidLoad вызывается перед конструктором - PullRequest
0 голосов
/ 15 марта 2011

Этот вопрос относится к этому . У меня есть два конструктора:

- (id)initWithBanner:(NSMutableArray *)banners {
  if ( self = [super initWithNibName:@"UIBanner" bundle:nil] ) {
     testString = [[NSString alloc] initWithString:@"Banner"];
     NSLog(@"Foo");
  }

  return self;
}

- (id)initWithPreview:(NSMutableArray *)previews {
  if ( self = [super initWithNibName:@"UIBanner" bundle:nil];
    testString = [[NSString alloc] initWithString:@"Preview"];
    NSLog(@"Foo");
  }

  return self;
}

- (void)viewDidLoad {
  NSLog(@"%@", testString);
}

В другом объекте у меня есть два экземпляра этого класса, называемые * bannerPreview и * bannerVideo, инициализированные с помощью initWithPreview и initWithVideo. Вот что это происходит: В конструкторе предварительного просмотра я не могу получить доступ к IBOutlets, потому что они нулевые, а их нет в баннере. Но метод viewDidLoad bannerVideo вызывается ДО того, как конструктор завершил работу, а viewDidLoad bannerPreview - нет. Я добавил строковый тест в класс и NSLog (@ "Foo") в двух методах, перечисленных выше, и мой вывод:

2011-03-15 12:29:13.929 iUDC[2600:207] Foo
2011-03-15 12:29:13.934 iUDC[2600:207] preview
2011-03-15 12:29:15.038 iUDC[2600:207] (null)
2011-03-15 12:29:15.038 iUDC[2600:207] Foo

Как мне справиться с этим поведением?

Ответы [ 2 ]

0 голосов
/ 15 марта 2011

В вашем методе initWithPreview: есть ошибка.Вероятно, следует сказать:

[super initWithNibName:@"UIPreview" bundle:nil]
0 голосов
/ 15 марта 2011

То, что вы делаете в init, не должно зависеть от того, что вы делаете в viewDidLoad.Все, что зависит от self.view, должно быть выполнено в viewDidLoad.

То, вызывается ли viewDidLoad до или после завершения init, зависит от того, сколько времени потребуется для загрузки представления и каквремя выполнения init.

...