2012-10-08 22 views
16

Tôi đang cố gắng thêm UICollectionView vào tệp .nib trong IB. Tôi đã làm việc thông qua một vài hướng dẫn và không có vấn đề gì.UICollectionView không chứa UICollectionViewCell trong IB

Trong ứng dụng hiện có, khi tôi kéo chế độ xem bộ sưu tập vào chế độ xem trong IB và sau đó mở rộng đối tượng, LayoutView FlowView có ở đó, nhưng không có ô xem bộ sưu tập. Tôi cũng không thể kéo và thả ô vào chế độ xem bộ sưu tập. Ngoài ra, chế độ xem bộ sưu tập được hiển thị khác nhau, hiển thị hình ảnh lưới ô thay vì hộp màu trắng bình thường.

Tôi đã thử tạo bộ điều khiển chế độ xem mới bằng ngòi và có cùng kết quả khi thêm bộ sưu tập.

Ứng dụng này được nhắm mục tiêu iOS 4.2, nhưng tôi đã thay đổi mục tiêu triển khai lên iOS 6.

Trong bất kỳ dự án mới được tạo ra tôi không nhận được hành vi này.

+6

OK, có vẻ như bạn chỉ có thể bố trí một UICollectionView hoàn toàn sử dụng IB bên trong bảng phân cảnh. Trong một .nib bạn nhận được hành vi mà tôi đã mô tả ở trên. Trong bảng phân cảnh, bạn có được UICollectionViewCell với UICollectionView của bạn. Có chuyện gì thế? – Alpinista

+0

có vấn đề tương tự này, khá khó chịu – adit

+0

Ngay cả trong bảng phân cảnh, bạn không thể xỉn và thả ô xem bộ sưu tập vào đối tượng xem bộ sưu tập. Không chắc chắn lý do tại sao. – theiOSguy

Trả lời

3

Xác định chế độ xem ô của bạn trong tệp nib riêng biệt. Khung nhìn phải thuộc loại UICollectionViewCell hoặc một lớp con.

Sau đó, bạn phải đăng ký nib với quan điểm bộ sưu tập của bạn:

- (void)viewDidLoad 
{ 
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil]; 
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"]; 
} 
+2

vì một số lý do này không hoạt động. khi dequeueing các tế bào, một ngoại lệ được ném: "nib phải chứa chính xác một đối tượng cấp cao nhất mà phải là một UICollectionReusableView dụ". điều này thực sự lạ, vì tài liệu nói rõ "Tệp nib chỉ được chứa một đối tượng cấp cao nhất và đối tượng đó phải thuộc kiểu UICollectionViewCell". – DELUXEnized

+0

UICollectionViewCell kế thừa từ UICollectionReusableView. –

8

Tôi không thể cho bạn biết lý do tại sao nó không hoạt động, nhưng đối với tôi cách tiếp cận lớp con từ bài viết trên blog này đã giải quyết được vấn đề:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

đây là một bản tóm tắt ngắn gọn:

  • tạo lớp mới MyViewCell mở rộng UICollectionViewCell và tạo các thuộc tính, hành động, các cửa hàng và các phương thức khi cần thiết.

@interface MyViewCell : UICollectionViewCell

  • tạo một View (tập tin xib) với một Bộ sưu tập Xem di động như đối tượng gốc của nó (và xóa các đối tượng được tạo ra theo mặc định).
  • trong các thuộc tính thiết lập lớp tùy chỉnh của bộ sưu tập này Xem ô để mở rộng lớp MyViewCell của bạn (thay vì UICollectionViewCell mặc định).
  • trong các thuộc tính trong Chế độ xem có thể sử dụng lại bộ sưu tập xác định Mã định danh, ví dụ: myCell, bạn sẽ cần điều này sau để đăng ký cuộc gọi của bạn.
  • quay lại lớp tùy chỉnh của bạn và sửa đổi phương thức inithWithFrame để tải và sử dụng chế độ xem được tạo của bạn.

    - (id)initWithFrame:(CGRect)frame 
    { 
        self = [super initWithFrame:frame]; 
        if (self) 
        { 
        // Initialization code 
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil]; 
    
        if ([arrayOfViews count] < 1) { return nil; } 
    
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; } 
    
        self = [arrayOfViews objectAtIndex:0]; 
        } 
        return self; 
    } 
    
  • sau đó bạn có thể đăng ký lớp này được sử dụng bởi các collectionView với

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

+0

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. –

+0

Tôi đã thêm các chi tiết khác vào câu trả lời. – DELUXEnized

+0

Tuyệt vời! Chỉ cần đừng quên đăng ký collectionView: [self.collectionView registerClass: [MyViewCell class] forCellWithReuseIdentifier: @ "myCell"]; – atulkhatri

0

Trong khi những câu trả lời là chính xác, nguyên nhân cơ bản của vấn đề là khá tinh tế và Apple cần cập nhật thông báo lỗi của họ trong nhật ký.Khi bạn nhìn thấy:

Unknown class MyViewCell in Interface Builder file. 

gì nó thực sự có nghĩa là mã nguồn của bạn là mất tích việc kê khai @implementation hoặc file .m chưa được bổ sung vào mục tiêu. Vì vậy, kiểm tra mã của bạn và chắc chắn rằng bạn có:

@implementation MyViewCell 

@end 

Điều này đúng cho cả UITableViewCell và UICollectionViewCell.

Tôi thảo luận thêm về vấn đề này tại https://stackoverflow.com/a/12755891/539149 cho trường hợp chung.

Điều thú vị là nếu bạn đang thiếu @implementation và gọi:

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

Bạn sẽ thấy:

Undefined symbols for architecture armv7: 
    "_OBJC_CLASS_$_MyViewCell", referenced from: 
     objc-class-ref in MyViewController.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Vì vậy của Apple biết về vấn đề này, họ chỉ aren' t phát hiện nó trong quá trình biên dịch. Tôi sẽ khuyên bạn không nên đặt các ô tùy chỉnh trong các ngòi ngách riêng biệt hoặc gọi registerClass: forCellWithReuseIdentifier :. Nó sạch hơn nhiều để lưu trữ các tế bào tùy chỉnh bên trong của UICollectionView container của nó hoặc UITableView trong giao diện Builder.

8

Đã lâu rồi kể từ khi câu hỏi được đặt ra nhưng gần đây tôi gặp phải vấn đề tương tự.

Cuối cùng, tôi đã tìm thấy câu trả lời here.

Nói tóm lại:

  • Bạn không thể kéo và thả một UICollectionViewCell thành một UICollectionView nếu bạn đang ở trong một tập tin .xib. Điều này chỉ có thể có trong bảng phân cảnh.
  • Cách giải quyết là tạo ra một tập tin .xib cho tế bào tùy chỉnh của bạn và đăng ký các tế bào bằng tay sử dụng:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

+0

Đây vẫn là sự cố trên Xcode 8.2.1.Tôi nghĩ chúng ta phải sử dụng cách giải quyết này mãi mãi. –

+0

Để giải quyết sự cố này, tôi phải sử dụng registerNib hoặc nếu không dequeueReusableCell chỉ là một chế độ xem trống, không có bất kỳ thông tin nào được định cấu hình trong xib. –

+0

Vẫn giống w/Xcode 8.3. Tại sao... – Jonny

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