Сбой заголовка раздела UICollectionReusableView из-за подключения IBOutlet

У меня есть UICollectionViewController, который делегирует UICollectionViewDataSource и UICollectionViewDelegate. В моем представлении коллекции отображаются 2 раздела с несколькими строками данных и все работает нормально.

Я создал заголовок раздела (в IB Attributes Inspector -> Accessories), который затем создает подклассы UICollectionReusableView с классом SWOHighScoreHeader:

@interface SWOHighScoreHeader : UICollectionReusableView
@property (strong, nonatomic) IBOutlet UILabel *hiScoreHead;
@end

Я установил этот класс (SWOHighScoreHeader) в качестве пользовательского класса для UICollectionReusableView в IB.

В UICollectionViewController я использую метод:

-(UICollectionReusableView*)collectionView:(UICollectionView*)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

SWOHighScoreHeader *highScoreHeaderView = nil;

if ([kind isEqual:UICollectionElementKindSectionHeader]) {
    highScoreHeaderView = [collectionView dequeueReusableSupplementaryViewOfKind:kind
                                                             withReuseIdentifier:@"highScoreTableHead"
                                                                    forIndexPath:indexPath];
}

return highScoreHeaderView;
}

Идентификатор highScoreTableHead задается как идентификатор многократно используемого представления коллекции UICollectionReusableView в IB.

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

Моя проблема возникает, когда я связываю свойство IBOutlet UILabel hiScoreHead с выходом в IB. Когда я это делаю, программа вылетает с:

Неизвестный класс SWOHighScoreHeader в файле построителя интерфейсов.

** * Завершение работы приложения из-за необработанного исключения "NSUnknownKeyException", причина: "[setValue:forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключа submitButton".

Я попытался удалить подключение к розетке и снова подключиться, но все равно ничего. Есть идеи, где я ошибаюсь?


person Mark__C    schedule 02.04.2015    source источник


Ответы (3)


Добавьте следующее свойство в SWOHighScoreHeader:

@property (weak) IBOutlet UIButton* submitButton;

Или попробуйте выяснить, какой объект в вашей раскадровке ожидает, что submitButton действительно существует.

person joeybladb    schedule 02.04.2015
comment
Я добавил submitButton и подключил его в IB таким же образом, но с той же проблемой. ››Или попробуйте выяснить, какой объект в вашей раскадровке ожидает фактического существования кнопки submitButton.‹‹ Как мне это сделать? - person Mark__C; 02.04.2015
comment
Это довольно сложно, но перейдите к своей раскадровке, откройте инспектор подключений, а затем просмотрите иерархию представлений, пока не найдете потерянный выход или действие, нацеленное на submitButton. - person joeybladb; 03.04.2015

IBoutlet всегда должен быть слабым свойством, иначе его контейнер не будет освобожден.

person Kujey    schedule 02.04.2015
comment
Хорошо спасибо. Я не был уверен в этом. Поменяли на слабую, но это не причина проблемы. - person Mark__C; 02.04.2015

Я решил это, используя теги вместо IBOutlets, т.е.

UILabel *hiScoreHeader = (UILabel *)[highScoreHeaderView viewWithTag:101];
hiScoreHeader.text = @"Header Text";

Я не уверен, почему IBOutlets не работают, но, по крайней мере, у меня есть решение.

person Mark__C    schedule 02.04.2015