我有一个Storyboard,其中包含一个带有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应用程序
答案 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
相同的故事板中...
NSCollectionViewItem
拖到画布上(和空白区域)。NSCollectionViewItem
是 NSViewController
的子类。在您的 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
方法即可实现此功能。