2016-02-23 27 views
7

Tôi đang thử nghiệm API mới NSCollectionView, được giới thiệu ở El Capitan.Dữ liệu NSCollectionViewNguồn không hoạt động đúng

Theo dõi video WWDC, tôi tạo một lớp con của NSCollectionViewFlowLayout để xác định bố cục của chế độ xem bộ sưu tập.

class Layout : NSCollectionViewFlowLayout { 

    override func prepareLayout() { 

    super.prepareLayout() 

    self.minimumInteritemSpacing = 0 
    self.minimumLineSpacing = 0 

    let cheight = self.collectionView!.bounds.height 
    let cwidth = self.collectionView!.bounds.width 

    self.itemSize = CGSizeMake(cwidth/2.0, cheight/6.0) 

    } 

} 

Sau đó, tôi đã tạo một lớp con NSObject làm nguồn dữ liệu.

class DataSource : NSObject, NSCollectionViewDataSource { 

    func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 5 
    } 

    func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem { 

    /* DOESN'T GET CALLED! */ 

    let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: indexPath) 

    item.view.wantsLayer = true 
    item.view.layer?.backgroundColor = NSColor.redColor().CGColor 

    return item 

    } 

} 

Các vấn đềcollectionView:itemForRepresentedObjectAtIndexPath: không bao giờ được gọi.

Đây là cách tôi khởi sự xem bộ sưu tập:

let collectionView = NSCollectionView(frame: view.bounds) 

let dataSource = DataSource() 
let layout = Layout() 

collectionView.collectionViewLayout = layout 
collectionView.registerClass(NSCollectionViewItem.self,  
          forItemWithIdentifier: "cell") 
collectionView.dataSource = dataSource 

collectionView.backgroundColors = [.blackColor()] 

Tôi có thể thấy rõ quan điểm bộ sưu tập trong SuperView của nó, nhưng không có các tế bào.

Ngoài ra, dòng này, nếu được gọi bên ngoài đại biểu (nhưng sau khi lớp học được đăng ký) làm cho ứng dụng bị lỗi!

let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: /*any index path*/) 

Tôi có làm gì sai hoặc là NSCollectionView API mới bị hỏng không?

Cảm ơn.

+0

Đây có lẽ là một câu hỏi ngu ngốc nhưng bạn đang thêm chế độ xem bộ sưu tập vào các bản xem phụ của chế độ xem của bạn, phải không? – Aaron

+0

@Aaron Tôi là. Tôi có thể thấy giao diện bộ sưu tập trong superview của nó (không có ô) –

+1

làm thế nào để bạn biết phương pháp này không được gọi? bạn đã đặt một số điểm ngắt trong phương pháp đó chưa? hoặc cố gắng để đăng nhập một cái gì đó bên trong cơ thể của phương pháp? tệp 'cell.xib' của bạn trong cùng một gói? hoặc bạn tạo giao diện lập trình (vì bạn đã đăng ký một _class_ nhưng không phải là _nib_)? bạn đã thay đổi biểu mẫu lưu lượng của chế độ xem _ "cũ" thành ví dụ chưa _ "flow" _ trong IB? – holex

Trả lời

0

Phương pháp này makeItemWithIdentifier là rất quan trọng và tìm kiếm .xib có tên là "tế bào" trong bạn bó: bạn có thể cần phải đăng ký với registerNib: forItemWithIdentifier: nếu nó xuất phát từ bó khác.

Như vậy vấn đề của bạn đến trước đó, kể từ collectionView của bạn: itemForRepresentedObjectAtIndexPath không bao giờ được gọi và điều này có thể xuất phát từ mô hình của bạn: tại sao bạn tạo ra một lớp mới để phục vụ như nguồn dữ liệu và không sử dụng cùng một NSViewController nơi cư trú NSCollectionView ?

Tôi luôn làm như vậy và với API mới, tất cả đều hoạt động hoàn hảo. Hy vọng điều này có thể giúp bạn!

+0

Tôi đang cố tạo chế độ xem bộ sưu tập theo chương trình, đó là lý do tại sao tôi ' m bằng cách sử dụng 'registerClass: forItemWithIdentifier:' thay vì 'registerNib: forItemWIthIdentifier'. –

+0

Tôi cũng đã thử cả registerClass và registerNib mà không có may mắn. numberOfItemsInSection được gọi nhưng itemForRepresentedObjectAtIndexPath thì không. – empedocle

0

Tôi đã gần như cùng một vấn đề, và đây là cách tôi giải quyết nó.

Trước hết là vấn đề tôi đã:

  • khi tôi xem bộ sưu tập đại biểu đã không thực hiện giao thức NSCollectionViewDelegateFlowLayout, tất cả mọi thứ được tốt và collectionView: Phương pháp itemForRepresentedObjectAtIndexPath được gọi là
  • khi tôi xem bộ sưu tập đại biểu là triển khai giao thức NSCollectionViewDelegateFlowLayout, phương thức collectionView: itemForRepresentedObjectAtIndexPath KHÔNG được gọi là

Tôi đã nhận xét mọi NSColl ectionViewDelegateFlowLayout phương pháp trong đại biểu, và nó bật ra rằng nếu phương pháp collectionView: layout: referenceSizeForHeaderInSection: đã được nhận xét ra, sau đó tất cả mọi thứ đã tốt một lần nữa (mặc dù tôi không sử dụng tiêu đề).

Hóa ra là bộ sưu tậpXem: bố cục: referenceSizeForHeaderInSection: trả về một NaN thay vì 0.0 là chiều rộng trong kích thước (lỗi sao chép/dán ngu ngốc).

Bạn có chắc chắn rằng bạn không có cùng một loại vấn đề với bố cục của mình không?

0

Vấn đề tôi gặp phải là tôi đã không đăng ký hoặc là nib hoặc lớp học cho các mục của chế độ xem bộ sưu tập. Các triệu chứng chính xác như những gì bạn mô tả - numberOfItemsInSection được gọi, và itemForRepresentedObjectAtIndexPath thì không. Sau khi đăng ký một nib, phương thức bắt đầu được gọi. Đây là câu trả lời có liên quan - https://stackoverflow.com/a/39516035/4635852

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