iOs:为什么IBOutlets在[[alloc] init]之后没有接线,但是在viewDidUnload:之后被调用了

时间:2010-11-09 14:40:55

标签: iphone ios interface-builder

我有一个简单的UINavigationViewController,当选择某个项目时会创建一个模态视图,其中包含UIImageView(下面的PostcardViewController)。但是,如果我打电话

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

postcardViewController.imageView是nill,图像永远不会显示。如果我切换后两行,并将其设为:

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

postcardViewController.imageView已设置,显示正常。所有内容都在Interface Builder中连接,PostcardViewController中没有任何特定代码。通过调试,我发现,在调用[viewDidLoad]之后,调用了imageView,并在调用[viewDidLoad]时调用[presentModalViewController]。 / p>

为什么会这样,而且我在这里做错了什么?我想我应该在实际显示之前设置整个视图,但截至目前,我必须先显示它才能完全设置它。

3 个答案:

答案 0 :(得分:7)

您只使用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];

答案 1 :(得分:4)

出口是零,因为初始化控制器不会加载nib / xib。只有在访问了view属性之后(如显示的那样)才会加载nib并连接到控制器。

PostcardViewController负责在viewDidLoad中设置imageView的图像。创建一个图像属性以传递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;
}

答案 2 :(得分:4)

这是因为UIViewControllers懒洋洋地加载他们的视图。因此,在您实际尝试呈现视图之前,视图不会加载。