从NIB加载视图,即使其他IBOutlet工作正常,IBOutletCollection也是零

时间:2013-05-03 08:43:13

标签: ios objective-c xcode interface-builder

我在NIB文件中布局了一个视图,然后将我的UIView子类添加为文件所有者。

子类看起来像这样:

@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;

属性很弱,因为:https://stackoverflow.com/a/7729141/1016515

然后,我将nib中的标签和UIImageViews从视图连接到文件所有者。

然后,在子类的awakeFromNib部分,我这样做了:

[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);

我希望看到categoryLabel和图像的地址。相反,我发现类别标签很好,图像是nil

这非常令人费解,因为imagescategoryLabel的声明是相同的。为什么一个工作而另一个工作失败?

1 个答案:

答案 0 :(得分:77)

我之所以这样,是因为我没有在任何地方找到这个问题,但如果你习惯使用IBOutlets而不是IBOutletCollections,这似乎是一个非常容易犯的错误。

我创建了属性weak,因为这是我通常为IBOutlets做的事情,原因是在另一个问题中讨论过。

我忽略的是IBOutletCollection是类的实例变量,而不仅仅是对视图层次结构的任意引用。因此,如果它是弱属性,则NSArray *将立即释放,因为视图层次结构不像其他IBOutlet属性那样保留它。

修复很简单,请设置属性strong

@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;

更新:根据this answer,几乎所有IBOutlet都应该很强大,除非它们必须很弱以避免保留周期。这是新的,大多数文档仍然说出口应该是弱的。