2013-05-03 1 views
17

Я выложил представление в файле NIB, а затем добавил свой подкласс UIView в качестве владельца файла.Загрузка представления из NIB, IBOutletCollection равно нулю, хотя другие функции IBOutlet работают нормально

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

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

свойства являются слабыми из-за этого: https://stackoverflow.com/a/7729141/1016515

Тогда я проводной вверх ярлык и UIImageViews в бобах, с тем чтобы владелец файла ,

Затем в awakeFromNib части подкласса, я сделал это:

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

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

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

ответ

75

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

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

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

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

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

Update: Согласно this answer, почти всем IBOutlets должны быть сильными, если только они не должны быть слабыми, чтобы избежать сохранения цикла. Это ново, и в большинстве документов все еще говорят, что розетки должны быть слабыми.

+0

Работы. Легко пропустить это. Думал так же, как иди! –

+0

Пропустил это, потому что, будучи слабым, он автоматически отключается и не падает с помощью forin (foreach, что угодно) – txulu

Смежные вопросы