2012-09-29 33 views
29

Tôi đang cố gắng sử dụng UICollectionViewCell, vì tất cả những gì tôi muốn hiển thị là hình ảnh. Tôi có thể thêm hình ảnh vào ô bằng cách sử dụng UIColor colorWithImage: trên thuộc tính contentView của UICollectionViewCell.UICollectionView cellForItemAtIndexPath không đăng ký ô

Trong phương pháp loadView của tôi, tôi đăng ký các tế bào như sau: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

Dưới đây là phương pháp của tôi cellForItemAtIndexPath:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    // cell customization 
    return cell; 
} 

Khi tôi chạy nó, ngay khi nó hits dòng dequeue, nó đổ vỡ với lỗi sau:

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:] 

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier MyCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

Tôi mệt mỏi thiết lập ô tùy chỉnh và sử dụng i t như lớp học và tôi đã nhận được lỗi tương tự. UICollectionViewCell được phân lớp tùy chỉnh của tôi và không có gì được triển khai, ngoại trừ initWithFrame mặc định. Đó là bởi vì tôi muốn thay đổi màu nền của khung nhìn. Tôi không chắc vấn đề là gì nhưng có thể ai đó vui lòng xem mã của tôi và giúp tôi không? Tôi đã cố gắng tìm ra điều này trong một thời gian và hoàn toàn không có may mắn chút nào.

Trả lời

60

Nếu bạn chỉ muốn hiển thị hình ảnh, bạn không cần phải thực hiện bất kỳ phân lớp con nào, bạn có thể đặt số backgroundColor của ô bằng colorWithPatternImage:. Đăng ký lớp học như thế này:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 

Sau đó, sử dụng nó như vậy:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 

Trong ví dụ này, kết quả là một array của UIImages.

8

Hãy thử đặt một breakpoint trên

[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"]; 

tôi sẽ đoán loadView của bạn (bạn đã có nghĩa viewDidLoad?) Phương pháp không được gọi, vì vậy lớp không bao giờ được đăng ký với collectionView.

6

nếu xem bộ sưu tập của bạn được kết nối trên kịch bản và các đại biểu và nguồn dữ liệu được thiết lập ở đó, và bạn cung cấp những phương pháp cần thiết cho nguồn dữ liệu và đại biểu, sau đó thêm các cuộc gọi đăng ký làm sự trở lại

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath 

một UICollectionView thay vì lớp con của riêng bạn. Vì vậy, làm một trong hai nhưng không phải cả hai.

+1

Cảm ơn bạn vì điều này! Đã lái xe cho tôi hạt :) –

+0

Nếu bạn muốn sử dụng Xib, bạn có thể tìm thấy câu trả lời trong tài liệu này [UICollectionView thêm UICollectionCell] (http://stackoverflow.com/questions/15184968/uicollectionview-adding-uicollectioncell). – Autobots

4

đặt tên định danh di động của bạn như trong mã

enter image description here

+0

Có điều này cùng với việc đăng ký xem bộ sưu tập trong viewDidLoad đã làm các trick. Tôi đã cố gắng gây ra một số nỗi đau trong cuộc gọi dequeue một lúc. Tôi đã có "Ô", tức là với một ô trống không liên quan, tất nhiên là không giống với "Ô", vì vậy hãy rất cẩn thận về tên của bạn. – TJA

12

Nếu bạn đang sử dụng xib trong applivation sau đó thêm sau trong phương pháp viewDidLoad bạn

[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"]; 

khác Nếu bạn sử dụng kịch bản thêm sau

[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"]; 

Cuối cùng là đ này (Nếu không)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath]; 
return cell; 
} 

Hy vọng ở trên sẽ giúp ích.

+2

Cảm ơn, nhắc tôi đăng ký "Nib", chúc bạn may mắn! – Resty

+0

Cảm ơn bạn rất nhiều. Đoạn trích đầu tiên của bạn là những gì tôi đang tìm kiếm :) – Mexx

+0

Tôi đang sử dụng bảng phân cảnh và ô tùy chỉnh mt không phải là bất kỳ ý tưởng nào? –

Các vấn đề liên quan