-1

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

在此处输入图像描述

您如何在 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 应用程序

4

3 回答 3

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 文件

于 2018-12-11T11:49:41.510 回答
0

这些文档总是值得一看:

为此,您可以调用makeItem(withIdentifier:for:)集合视图的方法来检索适当类型的空项目对象。

正如文档进一步解释的那样,要做到这一点,您需要在集合视图中注册一个 nib 或一个类。

于 2018-06-15T18:59:17.710 回答
0

故事板选项

如果您想NSCollectionViewItem在同一个故事板中包含NSCollectionView...</p>

  • 使用(加号,右上角,cmd-shift-L),将 aNSCollectionViewItem拖到画布上(和空白区域)。
  • 使用Document Outline(画布左侧,菜单:Editor->Document Outline),在“Collection View Item Scene”中选择“Collection View Item”。
  • 使用Identity Inspector(画布右侧,cmd-option-4)将“Storyboard ID”分配给“MyCustomItem”。
  • 可选:对于相当复杂的项目或出于可维护性的原因,您可能希望将“类”更改为自定义子类。
  • 它不直观,但NSCollectionViewItem它是NSViewController. 在您的实施中NSCollectionViewDataSource……</li>
    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方法即可。

于 2021-07-04T23:48:44.363 回答