21

当你将一个 NSCollectionView 拖到一个视图上时,一个 NSCollectionViewItem 会出现在情节提要上,四处飘荡。

想象一下,我将几个 NScollectionView 拖到同一个视图中。我会有一堆 NSCollectionViewItems。集合视图如何知道哪个 NScollectionViewItem 属于它?在界面生成器上可以看到两者之间是否存在联系?我在界面生成器上看不到任何内容?我在哪里可以看到?

编辑:显然这似乎是一个 Xcode 错误。当您将 NSCollectionView 添加到情节提要时,它没有指向 NSCollectionViewItem 的链接,并且似乎无法在它们之间连接 itemPrototype 插座。

在就此类错误与 Apple 联系后,他们的回答是:“这是 OS X 上 Storyboards 的一个已知问题。请改用 Xibs。”

4

8 回答 8

21

好吧,我尝试了@RubberDuck 的解决方法,但没有奏效(请参阅我的评论)。对我有用的是设置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
}
于 2014-10-27T09:43:44.047 回答
4

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

- (void)setCollectionView:(NSCollectionView *)collectionView {
    NSCollectionViewItem *itemPrototype = [self.storyboard instantiateControllerWithIdentifier:@"collection_item"];
    collectionView.itemPrototype = itemPrototype;
    _collectionView = collectionView;
}
于 2015-01-05T23:55:52.473 回答
4

是的,经过几个小时的努力,我再次确认了这个 Xcode 错误。

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

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

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

于 2014-10-25T02:54:58.410 回答
3

所选答案需要更多信息:

如果您使用 Interface Builder 的绑定将 collectionView 的内容绑定到数组控制器排列的对象,则会抛出错误:“NSCollectionView 项目原型不得为 nil”。

这是因为绑定是在分配 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)
于 2015-06-21T16:23:01.890 回答
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];
于 2016-03-06T08:37:18.627 回答
1

有一个连接到其特定的NSCollectionView插座。您可以在任一对象的连接检查器中看到这一点。itemPrototypeNSCollectionViewItem

于 2014-10-24T08:04:55.657 回答
1

转到对象库(Xcode 的右下角)并搜索“对象”。它“提供了一个在 Interface Builder 中不可用的 NSObject 子类的实例。” 将其拖放到情节提要中,到 ViewController 的顶部栏(或者在 LHS 的树视图中的 ViewController 下)。然后,单击该对象,并在“身份检查器”中将其类设置为你的 ViewItem 类。然后,您可以 ctrl+从 Collection View 拖动到 Object,它会让您将其连接为“itemPrototype”。

于 2015-04-10T12:11:00.027 回答
1

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

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

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

于 2018-05-28T19:49:54.670 回答