2016-10-16 4 views
0

에 속성을 적용하지 않는 : 레벨 1 (잠금 해제)UICollectionView * 어설 션 실패는 * 나는 다음을 수행하려고 UICollectionViewCell

A) 잠금 해제 수준에 대한 배경 이미지가 포함되어 있습니다.

B) 레벨 2-20이 잠겨 있습니다 (다른 배경 이미지 포함). 각각의 연속 레벨이 완료되면 잠금 해제됩니다.

처음에는 앱을 실행하고 UICollectionView으로 이동하면 모든 것이 잘 보입니다. 레벨 1을 실행하고 완료하면 코어 데이터를 통해 NSNumber 관리 객체 인 levelLocked의 번호 0을 저장하고 레벨 2에 속합니다 (0은 잠금 해제됨을 의미하고 나머지 레벨 3-20은 1).

레벨이 잠겨 있는지 여부를 저장하는 프로세스가 작동합니다. 하지만 내 UICollectionView으로 돌아 가면 레벨 2의 물리적 변화가 보이지 않습니다 (여전히 잠금 장치의 배경 이미지가 있음). 나는 UICollectionView 전에 ViewController로 돌아 가면

또한, 다음 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; 
} 

당신의 생각을 알려주세요. XCode 7.12와 함께 iOS 8.1을 사용하고 있습니다.

+0

예외에 대한 텍스트가 더 있습니까? 어설 션이 실패한 이유에 대한 이유 또는 설명이 있어야합니다. – Paulw11

+0

다른 게시물에서 언급했듯이 이것은 전체 어설 션 오류 메시지입니다. '어설 션 오류 - [UICollectionView _createPreparedCellForItemAtIndexPath : withLayoutAttributes : applyAttributes :]' –

+0

두 가지 나 한테 즉시 뛰어 내라. 먼저 하위 뷰를 셀에 추가하지만 셀을 다시 사용하는 경우 추가 하위 뷰를 추가합니다. 이러한 하위 뷰는 셀 하위 클래스의 일부 여야하며 여기에 추가 할 필요가 없습니다. 둘째, 태그를 사용하여 색인을 캡처하는 것은 허약합니다. 셀 단추를 누를 때 대리자 메서드가 호출되도록 셀과 컨트롤러간에 프로토콜을 구현하는 것이 좋습니다. 델리게이트 메소드는 셀을 받으면'indexPathForCell'을 사용하여 indexPath를 검색 할 수 있습니다. – Paulw11

답변

1

cellForItemAtIndexPath은 배열의 값이 0 또는 1이 아닌 경우 nil을 반환 할 수 있습니다.이 문제가 발생한 것으로 의심되어 컬렉션보기에 어설 션 오류가 발생했습니다. 왜냐하면 당신이 셀 대신에 그것을주지 않았기 때문입니다.

간단히 말해 else ifelse으로 변경하면 기본적으로 "잠긴"셀이됩니다.

오류를 기록한 새 else 절을 추가하여 0/1을 얻지 못하는 이유를 시도하고 진단 할 수 있습니다.

+0

다시 한 번 어서 트 오류가 사라지고 앱이 더 이상 충돌하지 않습니다. 코어 데이터로 몇 가지를 만져서 잠금 해제 된 모든 레벨이 현재 잠금 해제 된 레벨 대신 숫자 문자열로 나타나는지 확인해야합니다. –

관련 문제