我有一个简单的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>
为什么会这样,而且我在这里做错了什么?我想我应该在实际显示之前设置整个视图,但截至目前,我必须先显示它才能完全设置它。
答案 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懒洋洋地加载他们的视图。因此,在您实际尝试呈现视图之前,视图不会加载。