如何从主Storyboard实例化NSCollectionViewItem以用于collectionView

时间:2018-06-15 18:51:24

标签: swift macos cocoa nscollectionview nscollectionviewitem

我有一个Storyboard,其中包含一个带有NSCollectionView的控制器。 Storyboard还包含一个NSCollectionViewItem,其出口连接到NSCollectionViewItem子类,FeedItem。

enter image description here

如何在itemForRepresentedObjectAt方法中使用Storyboard中的“单元格”或“场景”(不是单独的nib文件)?

这是我到目前为止所拥有的......

  class FeedsController : NSViewController, NSCollectionViewDataSource {
  @IBOutlet weak var collectionView: NSCollectionView!

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  func numberOfSections(in collectionView: NSCollectionView) -> Int {
    return 1
  }

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

  func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
    let collectionViewItem = self.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "FeedItem")) as! FeedItem

    collectionViewItem.urlLabel.stringValue = "http://www.seanbehan.com"
    collectionViewItem.entriesLabel.stringValue = "15 Entries"
    collectionViewItem.updatedLabel.stringValue = "Last Update: June 1st at 3:15PM"

    return collectionViewItem
  }
}

class FeedItem : NSCollectionViewItem {
  @IBOutlet weak var urlLabel: NSTextField!
  @IBOutlet weak var updatedLabel: NSTextField!
  @IBOutlet weak var entriesLabel: NSTextField!
}

这是使用Swift 4.1的MacOS Cocoa应用程序

3 个答案:

答案 0 :(得分:1)

从情节提要中实例化NSCollectionViewItem的唯一方法是itemProtorype,该版本在10.14版被不推荐使用

如果您仍在使用旧版SDK,则可以这样做

let itemIdentifier = NSStoryboard.SceneIdentifier(rawValue: "CollectionViewItemIdentifier")

if let item = NSStoryboard.main?.instantiateController(withIdentifier: itemIdentifier) as? NSCollectionViewItem {
    collectionView.itemPrototype = item
}

但是我强烈建议使用 .xib 和Apple文档中描述的方法:

长话短说,您必须为NSCollectionViewItem使用.xib文件

答案 1 :(得分:0)

docs始终值得一看:

  

您可以通过调用集合视图的makeItem(withIdentifier:for:)方法来检索相应类型的空项目对象。

正如docs进一步解释的那样,要做到这一点,你需要在集合视图中注册一个笔尖或类。

答案 2 :(得分:0)

故事板选项

如果您想将 NSCollectionViewItem 包含在与您的 NSCollectionView 相同的故事板中...

  • 使用(加号,右上角,cmd-shift-L),将 NSCollectionViewItem 拖到画布上(和空白区域)。
  • 使用文档大纲(画布左侧,菜单:编辑器->文档大纲),在“集合视图项目场景”中选择“集合视图项目”。
  • 使用身份检查器(画布右侧,cmd-option-4)将“故事板 ID”分配给“MyCustomItem”。
  • 可选:对于相当复杂的项目或出于可维护性的原因,您可能希望将“类”更改为自定义子类。
  • 它不直观,但 NSCollectionViewItemNSViewController 的子类。在您的 NSCollectionViewDataSource 实现中实现…
    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        guard let item = self.storyboard?.instantiateController(withIdentifier: "MyCustomItem") as? NSCollectionViewItem else {
            return NSCollectionViewItem()
        }
        // …
        return item
    }

注意:子类需要将 as? 向下转换类更改为它们的子类

无需使用任何 register 方法即可实现此功能。