iOs: почему IBOutlets не подключены после [[alloc] init], но после viewDidUnload: был вызван - PullRequest
3 голосов
/ 09 ноября 2010

У меня есть простое UINavigationViewController, которое при выборе определенного элемента создает модальное представление с UIImageView (PostcardViewController ниже) внутри него. Однако, если я позвоню

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init];
postcardViewController.imageView.image = image; 
[self.navigationController presentModalViewController:postcardViewController animated:YES];

postcardViewController.imageView - ноль, и изображение никогда не показывается. Если я переключу последние две строки и сделаю это:

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init];
[self.navigationController presentModalViewController:postcardViewController animated:YES];
postcardViewController.imageView.image = image; 

postcardViewController.imageView установлено, и оно отображается нормально. Все связано в Интерфейсном Разработчике, и у PostcardViewController нет никакого определенного кода в нем. После отладки я узнал, что после вызова [viewDidLoad] был подключен imageView, и когда я вызвал [presentModalViewController], был вызван [viewDidLoad].

Почему это, а также я что-то здесь не так делаю? Я подумал, что мне нужно настроить весь вид, прежде чем я его покажу, но на данный момент мне нужно отобразить его, прежде чем я смогу полностью его настроить.

Ответы [ 3 ]

7 голосов
/ 09 ноября 2010

Вы только создали контроллер представления, используя alloc + init, но не само представление.Представление загружается лениво, т. Е. При первом использовании.Чтобы заставить представление быть созданным до того, как оно действительно будет показано, сделайте следующее:

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init];
postcardViewController.view; // Forces the view to be loaded
postcardViewController.imageView.image = image; // Will no longer be nil
[self.navigationController presentModalViewController:postcardViewController animated:YES];
4 голосов
/ 09 ноября 2010

Это потому, что UIViewControllers загружают свои представления лениво. Таким образом, представление не загружается, пока вы на самом деле не попытаетесь его представить.

4 голосов
/ 09 ноября 2010

Выходы - ноль, потому что инициализация контроллера не загружает nib / xib.Только после того, как к свойству view обращаются (например, когда он представлен), перо загружается и подключается к контроллеру.

Пусть PostcardViewController отвечает за установку изображения imageView в viewDidLoad.Создайте свойство изображения для передачи UIImage.

PostcardViewController *pvc= [[PostcardViewController alloc] init];
pvc.image = image; 
[self.navigationController presentModalViewController:pvc animated:YES];
[pvc release];

В PostcardViewController.h

  ...
  UIImage *image
}
@property (nonatomic, retain) UIImage *image;

В PostcardViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    imageView.image = image;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...