2013-09-26 154 views
7

Trong ứng dụng của tôi có UICollectionView sử dụng flowLayout và nó hoạt động tốt trong iOS 6 nhưng thất bại khủng khiếp trong iOS 7. Ngay sau khi tôi phân biệt chế độ xem chứa UICollectionView của tôi, đây là những gì xảy ra:UICollectionView + iOS 7/Xcode 5 = Xác nhận thất bại

*** Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes:], /SourceCache/UIKit/UIKit-2903.2/UICollectionView.m:1401 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the view returned from -collectionView:viewForSupplementaryElementOfKind:atIndexPath 
(UICollectionElementKindSectionHeader,<NSIndexPath: 0x145f3f50> {length = 2, path = 0 - 0}) was not retrieved by calling -dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: or is nil' 
(<UICollectionReusableView: 0x145f9400; frame = (0 0; 320 20); layer = <CALayer: 0x145f90c0>>) 

Trả lời

12

Khi tôi cập nhật lên iOS 7 Tôi chạy vào này. Vấn đề kết thúc là bạn không nên rõ ràng với dataSource của bạn. Nếu bạn có những điều sau đây, loại bỏ nó:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { 
    return nil; 
} 
+0

Câu trả lời hoàn hảo @ZaBlanc, cảm ơn bạn! Bất kỳ ý tưởng gì đã thay đổi từ iOS 6 đến 7? [The iOS 7 API Diffs] (https://t.co/vuiz2TaU3r) không hiển thị bất cứ điều gì ngoài việc thêm vào UICollectionView –

1

bạn cần phải đăng ký một UINib với dụ UICollectionView của bạn:

UINib *nib = [UINib nibWithNibName:@"YourNibNameWithoutExtension" bundle:nil]; 
[collectionView registerNib:nib forCellWithReuseIdentifier:@"YourReuseIdentifier"]; 

Và tạo tất cả các trường hợp UICollectionViewCell của bạn thông qua -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:].

bình luận trong UICollectionView.h của Apple này giải thích các yêu cầu:

// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath: 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 
+0

Cảm ơn @bneely, tôi đã đăng ký ngòi (và lớp học ban đầu) nhưng nó quay ra câu trả lời của ZaBlanc cố định vụ tai nạn bí ẩn. Đừng hỏi tôi làm thế nào/tại sao vì không có gì trong UICollectionView đã thực sự không được chấp nhận trong các Diff API của iOS7. –

6

Nó sẽ sụp đổ nếu bạn quay lại nil trong hàm này:

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

Về cơ bản, lý do duy nhất bạn sẽ phải quay trở lại nil là nếu "loại "NSString không phải là loại bạn mong đợi. Trong trường hợp đó, chỉ cần xóa đối tượng đó trong trình tạo giao diện. Tôi đã gặp sự cố tương tự này vì chế độ xem bộ sưu tập của tôi có chân trang trong trình tạo giao diện nhưng tôi không gọi mã số registerNib (như được mô tả ở trên) để thiết lập chân trang. Tôi muốn nhận được viewForSupplementaryElementOfKind và trả lại nil vì nó là một loại tôi không mong đợi. (Được đảm bảo gây ra sự cố).

0

Bạn nhận được lỗi đó vì bộ sưu tập của bạn có tiêu đề. Tôi nhận được điều đó sau khi thêm tiêu đề vào IB. Hủy bỏ các tiêu đề hoặc kiểm tra các đại biểu cho các tùy chọn tiêu đề

1

Tôi đã có vấn đề này, như giải quyết

Tôi nghĩ rằng bạn có thể kiểm tra bạn đã kiểm tra phần tiêu đề trong IB Collection View -> Accessories -> Tiêu đề của Phần

1

tôi nhận được điều này bằng cách quên để thiết lập lớp học của tôi để đúng loại trong xây dựng giao diện và không dây lên và các cửa hàng

+0

Aha ... một cái gì đó như thế này đã xảy ra quá! Cảm ơn bạn đã bình luận này, nó làm cho tôi kiểm tra xem mới được tái sử dụng của tôi xem .. bây giờ ngoại lệ mâu thuẫn nội bộ có ý nghĩa! : D – Pavan

0

Hãy chắc chắn bạn đã cài xem bộ sưu tập nguồn dữ liệu và đại biểu. Trong trường hợp của tôi lỗi này đã được ném vì nó.