Подтвердить что ты не робот

Загрузка представления из NIB, IBOutletCollection равно нулю, хотя другие IBOutlet работают нормально

Я выложил представление в файле NIB, а затем добавил свой подкласс UIView в качестве владельца файла.

Подкласс выглядит следующим образом:

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

Свойства слабые из-за этого: qaru.site/info/14675/...

Затем я подключил ярлык и UIImageViews в наконечнике, от представления до владельца файла.

Затем в части awakeFromNib подкласса я сделал следующее:

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

Я ожидал увидеть адреса категорииLabel и изображений. Вместо этого я обнаружил, что метка категории прекрасна и изображения nil.

Это довольно озадачивает, потому что объявления для images и categoryLabel идентичны. Почему одно работает, а другое терпит неудачу?

4b9b3361

Ответ 1

Я излагаю это, потому что я нигде не нашел вопроса, но, похоже, довольно легко сделать ошибку, если вы привыкли работать с IBOutlets, но не IBOutletCollections.

Я сделал свойства weak, потому что это то, что я обычно делаю для IBOutlets по причинам, обсуждаемым в другом вопросе.

То, что я пренебрег осознанием, заключается в том, что IBOutletCollection является переменной экземпляра класса, а не просто произвольной ссылкой в ​​иерархию представлений. Поэтому, если это слабое свойство, NSArray * будет немедленно выпущено, потому что иерархия представления не сохраняет его, как и для других свойств IBOutlet.

Исправление прост, сделайте свойство strong:

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

Обновить. В соответствии с этим ответом почти все IBOutlets должны быть сильными, если только они не должны быть слабыми, чтобы избежать цикла сохранения. Это ново, и в большинстве документов все еще говорят, что розетки должны быть слабыми.