简单的问题,我在使用故事板的UIViewController中定义了一个名为bigImageView
的UIImageView,
它在UIViewController的h文件中声明如下:
@property (retain, nonatomic) IBOutlet UIImageView *bigImageView;
在我的appDelegate
上我按如下方式启动UIViewController:
imageViewController = [storyboard instantiateViewControllerWithIdentifier:@"chosenImageController"];
这会在我的UIViewController m文件中调用initWithCoder:
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Custom initialization
}
return self;
}
此函数只调用一次,因此没有双初始化。
但是,稍后,当我检查我的bigImageView
指针时,它仍然是零。
是不是init应该为它分配内存? 我认为这就是为什么当我尝试设置这个UIImageview来保存UIImage时它不会显示图像的原因 感谢
答案 0 :(得分:0)
所有人都在努力解决这个问题。首先,nib / storyboard中的每个对象都会调用alloc / init,然后建立所有连接,然后调用viewDidLoad
。
您需要等待控制器上调用- (void)viewDidLoad
,然后才能设置bigImageView
。如果没有设置,那么你在故事板中做错了。
init
方法不负责分配任何内存。所有内存都由alloc
方法分配,该方法始终在init
之前调用。 Alloc将用nil/NULL/0
值填充所有实例变量,然后init给出了为每个变量分配初始值的机会(通常基于NSCoder对象的内容,但由您自己决定)该怎么办)。
然而,对于IB出口,这些是在init之后通过nib加载过程设置的。
编辑:
// ViewControllerA.m:
imageViewController = [storyboard instantiateViewControllerWithIdentifier:@"chosenImageController"];
imageViewController.image = imageToShow;
// ViewControllerB.h
@property (retain) NSImage *image;
@property (retain, nonatomic) IBOutlet UIImageView *bigImageView;
// ViewControllerB.m
- (void)viewDidLoad
{
self.bigImageView.image = self.image;
[super viewDidLoad];
}
答案 1 :(得分:-2)
您不需要定义initWithCoder,因为那里没有自定义逻辑。我会删除那个样板代码。
以下是我要检查的内容:
更新:听起来您想要在加载视图之前访问图像视图。没有办法做到这一点。一个hack就是调用viewController.view
来强制加载视图,但是有很多原因导致你不应该这样做。
更好的方法是在视图控制器上实现属性,这些属性在未加载视图和加载视图时都适用。您可以看到优雅解决方案in this question的示例。请注意如果加载视图,photographerLabel
将通过didSet
方法设置。另一方面,如果未加载视图,则将通过viewDidLoad
方法设置该视图。有关该代码的Objective-C版本或更多详细信息,请参阅该问题中的链接视频。