ios - 从 NIB 加载 View ,IBOutletCollection 为 nil,即使其他 IBOutlet 工作正常

标签 ios objective-c xcode interface-builder

我在 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

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

最佳答案

我提出这个问题是因为我在任何地方都找不到这个问题,但如果您习惯于使用 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/

相关文章:

ios - iOS 13:如何检测“语音控制”是否正在运行

objective-c - 如何使用 XCode 中的用户名/密码登录网站?

objective-c - 具有可达性的 Apple Mach-O 链接器 (Id) 错误

ios - CoreData 一对多只使用一个实体

iphone - Objective C 是否足够快用于 DSP/音频编程

objective-c - TableView 的多个委托(delegate)

ios - 在MFMailCompose中显示iPhone型号

ios - iOS 上未收到 Firebase 云消息通知

ios - 使用 @ 字符在 UserDefaults 上崩溃

ios - 使用 Parse 从一个用户向另一个用户发送推送通知