Cocoa - NSCollectionView和NSCollectionViewItem之间的链接在哪里? Xcode 6 Bug?

时间:2014-10-24 06:57:53

标签: cocoa nscollectionview nscollectionviewitem

将NSCollectionView拖动到视图时,故事板上会出现一个NSCollectionViewItem,它会浮动。

想象一下,我将几个NScollectionView拖到同一个视图中。我将有一堆NSCollectionViewItems。集合视图如何知道哪个NScollectionViewItem属于它?在界面构建器上可以看到两者之间是否存在连接?我在界面构建器上看不到任何内容?我在哪做什么?

编辑:显然这似乎是一个Xcode错误。当您向故事板添加NSCollectionView时,它没有指向NSCollectionViewItem的链接,似乎无法在它们之间连接itemPrototype出口。

在向Apple发送有关此类错误的消息后,他们的回答是:“这是OS X上Storyboard的一个已知问题。请改用Xib。”

8 个答案:

答案 0 :(得分:21)

好吧,我给了@ RubberDuck的解决方法,但它没有用(见my comment)。对我有用的是在视图控制器的collectionView.itemPrototype中设置viewDidLoad(Xcode 6.1):

@IBOutlet weak var collectionView: NSCollectionView!

override func viewDidLoad() {
    // don't forget to set identifier of CollectionViewItem 
    // from interface builder
    let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
        as NSCollectionViewItem
    self.collectionView.itemPrototype = itemPrototype
}

答案 1 :(得分:4)

是的,经过几个小时的努力,我再确认了一个Xcode漏洞。

唯一的解决方案是编辑文件Main.storyboard并将此行添加到CollectionView部分的末尾,就在</collectionView>之前:

<connections>
  <outlet property="itemPrototype" destination="XXXXXXX" id="Kaa-2J-b4e"/>
</connections>

其中XXXXXX是id或CollectionViewItem。另一个号码,你可以保留我发布的号码,除非你的项目已经使用了这个ID,但是这种情况发生的可能性很小。

答案 2 :(得分:4)

我无法从@mostruash获得接受的答案,也无法在Objective-C中工作,但我提出了另一种解决方法。对collectionView IBOutlet属性使用自定义setter:

- (void)setCollectionView:(NSCollectionView *)collectionView {
    NSCollectionViewItem *itemPrototype = [self.storyboard instantiateControllerWithIdentifier:@"collection_item"];
    collectionView.itemPrototype = itemPrototype;
    _collectionView = collectionView;
}

答案 3 :(得分:3)

选定的答案需要更多信息:

如果使用Interface Builder的绑定从collectionView的内容绑定到数组控制器排列的对象,它将抛出错误:&#34; NSCollectionView项原型不能为零&#34;。

这是因为在分配itemPrototype之前进行了绑定。相反,在itemPrototype赋值后使用代码进行绑定。

@IBOutlet weak var collectionView: NSCollectionView!
@IBOutlet var arrayController: NSArrayController!
let itemPrototype = self.storyboard?.instantiateControllerWithIdentifier("collectionViewItem")
        as NSCollectionViewItem
self.collectionView.itemPrototype = itemPrototype
collectionView.bind("content", toObject: arrayController, withKeyPath: "arrangedObjects", options: nil)

答案 4 :(得分:2)

无论如何,自10.11 Apple Documents说:

以来,我陷入了同样的问题

“你还必须断开并丢弃NSCollectionView的”itemPrototype“,这是10.10及更早版本API模型的遗迹。”

自: https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView

这里解释它现在是如何工作的。

所以我们必须使用旧的心爱的XIBS:

NSCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"Thing" forIndexPath:indexPath];

答案 5 :(得分:1)

NSCollectionView的插座itemPrototype与其特定NSCollectionViewItem相关联。您可以在Connections检查器中看到这两个对象。

答案 6 :(得分:1)

转到对象库(Xcode的右下角)并搜索&#34; Object&#34;。它提供了一个NSObject子类的实例,它在Interface Builder中不可用。&#34;将其拖放到故事板中,拖放到ViewController的顶部栏上(或者在LHS的树视图中的ViewController下)。然后,单击该对象,并在&#34; Identity Inspector&#34;将其类设置为您的ViewItem类。然后你可以按Ctrl +从Collection View拖动到Object,它会让你把它连接成&#34; itemPrototype&#34;。

答案 7 :(得分:1)

伙计们似乎是在使用Storyboard时不能使用Xcode中的Object集合中的常规ViewController。

对我来说有用的是从“对象”列表中拖动集合视图项并将其类设置为自定义类,然后像通常创建IBOutlet一样连接所有连接。

然后你必须实例化视图而不是makeView,但这种方式允许你在同一个集合中使用多个视图而不需要注册任何特殊的视图。