调用initWithCoder后,IBOutlet为零

时间:2014-03-30 06:15:02

标签: objective-c xcode uiimageview initwithcoder

简单的问题,我在使用故事板的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时它不会显示图像的原因 感谢

2 个答案:

答案 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,因为那里没有自定义逻辑。我会删除那个样板代码。

以下是我要检查的内容:

  1. 在故事板中,确保正确设置了视图控制器的类。
  2. 通过查找@property附近的圆圈,确保插座正确连接在故事板中。它应该是一个圆圈,而不是一个圆圈的轮廓。
  3. 确保仅在调用viewDidLoad后才读取该值。 Apple唯一的保证是在此方法调用后设置插座。
  4. 更新:听起来您想要在加载视图之前访问图像视图。没有办法做到这一点。一个hack就是调用viewController.view来强制加载视图,但是有很多原因导致你不应该这样做。

    更好的方法是在视图控制器上实现属性,这些属性在未加载视图和加载视图时都适用。您可以看到优雅解决方案in this question的示例。请注意如果加载视图,photographerLabel将通过didSet方法设置。另一方面,如果未加载视图,则将通过viewDidLoad方法设置该视图。有关该代码的Objective-C版本或更多详细信息,请参阅该问题中的链接视频。