2016-10-16 11 views
0

Я пытаюсь сделать следующее: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

+0

Есть ли еще текст для исключения? Должна быть причина или объяснение того, почему утверждение не сработало – Paulw11

+0

Как я уже упоминал в других сообщениях, это сообщение об ошибке полного утверждения: 'Assertion failure in - [UICollectionView _createPreparedCellForItemAtIndexPath: withLayoutAttributes: applyAttributes:]' –

+0

Несколько вещей выпрыгивай прямо на меня. Во-первых, вы добавляете subviews в ячейку, но в случае повторного использования ячейки вы будете добавлять дополнительные subviews. Эти подсмотры должны быть частью вашего подкласса ячейки, и вам не нужно добавлять их сюда. Во-вторых, использование метки для захвата индекса является хрупким. Лучше реализовать протокол между ячейкой и контроллером, чтобы вызвать метод делегата при нажатии кнопки ячейки. Метод делегата получает ячейку, а затем вы можете использовать 'indexPathForCell' для извлечения indexPath. – Paulw11

ответ

1

Ваш cellForItemAtIndexPath может вернуть nil, если значение в вашем массиве не равно 0 или 1. Я подозреваю, что это то, что происходит, а затем просмотр коллекции имеет ошибку утверждения , так как вы дали ему нуль вместо ячейки.

Простым решением является изменение else if на else, и по умолчанию это приведет к блокировке.

Вы также можете добавить новое предложение else, в котором регистрируется ошибка, и используйте это, чтобы попытаться диагностировать, почему вы не получаете 0/1.

+0

Еще раз спасибо, ошибка утверждения исчезла, и приложение больше не вылетает. Я должен прикоснуться к некоторым вещам с помощью Core Data, чтобы убедиться, что все уровни разблокированы, отображаются как числовые строки, а не только текущий разблокированный уровень. –