Я пытаюсь сделать следующее:UICollectionView * Утверждение Failure * для не применения атрибутов на UICollectionViewCell
A) Уровень 1 разблокирован (содержит фоновое изображение для разблокированных уровней).
B) Уровень 2-20 заблокирован (содержит другое фоновое изображение). Они будут разблокированы по мере завершения каждого последующего уровня.
Первоначально, когда я запускаю приложение и перехожу на свой UICollectionView
, все выглядит хорошо. Когда я играю на уровне 1 и завершу его, я сохраняю (через Core Data) номер 0 для управляемого объекта NSNumber
с именем levelLocked
, принадлежащий теперь уровню 2 (0 означает разблокировку, а остальные уровни 3-20 должны быть заблокированы с помощью 1).
Этот процесс сохранения уровня блокировки или разблокировки работает. Но когда я возвращаюсь к своему UICollectionView
, я не вижу физического изменения уровня 2 (он все еще имеет фоновое изображение блокировки).
Кроме того, если я вернусь к ViewController
перед UICollectionView
, а затем повторно ввести UICollectionView
, приложение падает с ошибкой:
*** Assertion failure in -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:],
Он появляется моя клетка не обновляется должным образом (я не знать, как правильно загружать данные). Я зарегистрировал пользовательский код UICollectionViewCell
для разблокированных и заблокированных типов уровней. Я проверил все правописания (вначале это не сработало бы, если бы это было проблемой).
Вот код для генерации ячейки.
static NSString *cellIdentifier = @"tortoiseCell";
static NSString *tortIdentifier = @"tortoiseLocked";
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *regular;
NSMutableArray *data = [self.dataArray objectAtIndex:indexPath.section];
NSString *cellData = [data objectAtIndex:indexPath.row];
NSMutableArray *ar = [self.lockArray objectAtIndex:indexPath.section];
NSNumber *arLocks = [ar objectAtIndex:indexPath.row];
if ([arLocks integerValue] == 0) {
TortoiseCell *cell = (TortoiseCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
[cell.buttonClick setTag:indexPath.row];
[cell.buttonClick setTitle:cellData forState:UIControlStateNormal];
[cell.buttonClick setBackgroundImage:[UIImage imageNamed:@"TortoiseLevels.png"]
forState:UIControlStateNormal];
[cell.buttonClick addTarget:self action:@selector(buttonPressedSoWhatNumber:)
forControlEvents:UIControlEventTouchUpInside];
cell.buttonClick.layer.masksToBounds = YES;
[cell addSubview:cell.buttonClick];
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
regular = cell;
} else if ([arLocks integerValue] == 1) {
TortoiseLocked *lockCell = (TortoiseLocked *)[collectionView dequeueReusableCellWithReuseIdentifier:tortIdentifier forIndexPath:indexPath];
[lockCell.tortoiseLock setTag:indexPath.row];
[lockCell.tortoiseLock setBackgroundImage:[UIImage imageNamed:@"TortoiseLock.png"]
forState:UIControlStateNormal];
lockCell.tortoiseLock.layer.masksToBounds = YES;
[lockCell addSubview:lockCell.tortoiseLock];
lockCell.layer.shouldRasterize = YES;
lockCell.layer.rasterizationScale = [UIScreen mainScreen].scale;
regular = lockCell;
}
return regular;
}
Дайте мне знать, что вы думаете. Я использую iOS 8.1 с XCode 7.1.2
Есть ли еще текст для исключения? Должна быть причина или объяснение того, почему утверждение не сработало – Paulw11
Как я уже упоминал в других сообщениях, это сообщение об ошибке полного утверждения: 'Assertion failure in - [UICollectionView _createPreparedCellForItemAtIndexPath: withLayoutAttributes: applyAttributes:]' –
Несколько вещей выпрыгивай прямо на меня. Во-первых, вы добавляете subviews в ячейку, но в случае повторного использования ячейки вы будете добавлять дополнительные subviews. Эти подсмотры должны быть частью вашего подкласса ячейки, и вам не нужно добавлять их сюда. Во-вторых, использование метки для захвата индекса является хрупким. Лучше реализовать протокол между ячейкой и контроллером, чтобы вызвать метод делегата при нажатии кнопки ячейки. Метод делегата получает ячейку, а затем вы можете использовать 'indexPathForCell' для извлечения indexPath. – Paulw11