2016-09-08 3 views
1

UICollectionView에서 셀을 삭제하려고합니다. 사용자 정의 레이아웃을 사용하고 있으며 컬렉션보기에 추가 한 긴 누르기 제스처 인식기에 대한 응답으로 삭제가 발생합니다. 읽은 내용부터 데이터 소스를 먼저 업데이트 한 다음 셀을 삭제해야합니다. 이는 내가하는 일입니다. 모든 것은 self.collectionView?.deleteItemsAtIndexPaths([indexPath])까지 원활하게 진행됩니다.UICollectionView 셀 삭제

*** 캐치되지 않은 예외 'NSInternalInconsistencyException'로 인해 앱 종료 중 'UICollectionView가 존재하지 않는 색인 경로가있는 셀의 레이아웃 속성을 받았습니다. 이유 : {length = 2, path = 0 - 0} '

다른 유사한 질문을 읽었지만 제대로 작동하지 않는 것 같습니다.

let book = self.booksForCurrentAuthor[indexPath.row] 

self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 

//Delete book from database 

편집 난이 관련이 있지만, 내 사용자 지정 레이아웃 객체에, 나는 prepareLayout() 방법 내에서 UICollectionViewLayoutAttributes의 캐시를 만들 생각하지 않는다

. 캐시는 머리글, 셀, 바닥 글 및 장식보기의 특성에 대한 별도의 배열이있는 사전입니다.

+0

그냥 제안 : UICollectionView를 사용할 때'indexPath.item'을 사용하십시오. –

+0

변경된 사항 - 다소 표준 컬렉션보기 레이아웃을 사용할 때 기능적 차이가 있습니까? – cweber105

+0

없음. 둘 다 경로의 두 번째 인덱스에 대한 편리한 접근 자입니다. –

답변

2

나는 사용자 정의 레이아웃 매니저가 실제로 아니라 문제가 될 수 있다고 생각 : 귀하의 경우

는 그런 일이 될 것입니다.

collectionView에서 셀을 삭제하면 기존 레이아웃을 무효화해야합니다. 그렇지 않으면 레이아웃 관리자는 원래 계산 된 캐시의 동일한 속성 배열 (예 : 보유하고있는 셀의 레이아웃 포함)을 제공합니다 따라서 오류가 삭제되었습니다.

데이터 소스에서 관련 항목을 삭제 한 후에는 cache.removeAll()을 호출 한 다음 prepareLayout()을 다시 호출하여 레이아웃 캐시를 새로 고칩니다. 그런 다음 collectionView.reloadData() (및 아마도 layoutSubviews() 및 setNeedsDisplay)를 호출하면 문제가 해결됩니다. collectionView가 대기열에없는 셀 스택에서 필요한 항목을 자동으로로드하므로 실제로 셀을 삭제하지 않아도됩니다.

어떻게 지내는지 알려주십시오. 최선.

+0

이것은 근본적으로 정확합니다. 맞춤 레이아웃을 잘 디자인하지 않았으므로 데이터가 변경되면서 속성을 동적으로 생성하고 재 작성하지 않았습니다. 데이터의 변경 사항을 설명하기 위해 여러 가지 메소드를 업데이트 했더니 문제가 없었습니다. 고맙습니다. – cweber105

0

Delete cell from UICollectionView에서 해결책을 시도 했습니까?

[self.collectionView performBatchUpdates:^{ 
     let book = self.booksForCurrentAuthor[indexPath.row] 
     self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
     self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 
    } completion:nil]; 
+0

예. 같은 오류. – cweber105