我在 NIB 文件中布置了一个 View ,然后将我的 UIView 子类添加为文件所有者。
子类如下所示:
@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;
因此属性较弱:https://stackoverflow.com/a/7729141/1016515
然后我将 nib 中的标签和 UIImageViews 从 View 连接到文件所有者。
然后,在子类的 awakeFromNib 部分,我这样做了:
[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);
我希望看到 categoryLabel 和图像的地址。相反,我发现类别标签很好,图像是 nil
。
这很令人费解,因为 images
和 categoryLabel
的声明是相同的。为什么一个工作,另一个失败?
最佳答案
我提出这个问题是因为我在任何地方都找不到这个问题,但如果您习惯于使用 IBOutlets 而不是 IBOutletCollections,这似乎是一个很容易犯的错误。
我将属性设置为 weak
因为这是我通常为 IBOutlets 所做的,原因在另一个问题中讨论过。
我没有意识到的是,IBOutletCollection 是该类的一个实例变量,而不仅仅是对 View 层次结构的任意引用。因此,如果它是一个弱属性,NSArray *
将立即被释放,因为 View 层次结构不会像其他 IBOutlet 属性那样保留它。
修复很简单,使属性strong
:
@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;
更新:根据this answer ,几乎所有的 IBOutlet 都应该是强的,除非它们必须是弱的以避免保留循环。这是新的,大多数文档仍然说 socket 应该很弱。
关于ios - 从 NIB 加载 View ,IBOutletCollection 为 nil,即使其他 IBOutlet 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16354777/