繁体   English   中英

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

[英]Cocoa - Where is the link between a NSCollectionView and a NSCollectionViewItem? Xcode 6 Bug?

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

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

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

在与Apple联系了这样的错误之后,他们的答案是: “这是OS X上Storyboard的一个已知问题。请改用Xibs。”

好吧,我给了@ RubberDuck的解决方法,但它没有用(参见我的评论 )。 对我viewDidLoad是在视图控制器的viewDidLoad中设置collectionView.itemPrototype (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
}

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

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

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

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

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

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

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

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

这是因为在分配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)

不管怎么说,自从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];

NSCollectionView有一个itemPrototype ,它连接到其特定的NSCollectionViewItem 您可以在Connections检查器中看到这两个对象。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM