Cocoa - 如何在集合视图中获取当前选定的对象?

时间:2014-07-16 22:29:37

标签: objective-c cocoa

我在cocoa应用程序中有一个NSCollectionView

我可以通过以下迂回方式获取有关集合视图中当前所选对象的信息:

NSIndexSet* index = [self.currentCollectionView selectionIndexes];
CardModel* card = [[self.currentCollectionView itemAtIndex:index.firstIndex] representedObject];

NSCollectionView类是否有返回所选对象的方法?或者这是首选方式吗?

3 个答案:

答案 0 :(得分:0)

如果您询问selectionIndexes是否是访问NSCollectionView选项的唯一方式,答案是肯定的。

答案 1 :(得分:0)

NSTableView不同,您没有代理/通知,可以通知您有关选择的信息。所以selectionIndexes是要走的路。

我不确定您是否为阵列控制器设置了观察者。但是,您显示的代码仅用于检索所选对象。要获得有关对象选择的通知,您需要在阵列控制器上为关键路径selectionIndexes添加观察者(或者在IB中设置)。

[myArrayController addObserver:self
       forKeyPath:@"selectionIndexes" 
       options:NSKeyValueObservingOptionNew
       context:nil];

-(void)observeValueForKeyPath:(NSString *)keyPath 
                     ofObject:(id)object
                       change:(NSDictionary *)change
                      context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        // This will be invoked whenever objects are selected in Collection View.
        // Now collectionView selectionIndexes can be used to get the selected objects.
    }
}

答案 2 :(得分:0)

一种方法是在xib中使用绑定。为要由集合中的视图表示的项设置NSArrayController。在xib中,在Collection View的Bindings Inspector中,将CollectionView的Content绑定到collectionViewArrayController.arrangedObjects。同时将选择索引绑定到collectionViewArrayController.selectionIndexes。现在,您可以在数组控制器中创建一个插座,例如在App Delegate中,然后访问那里的所选对象。

例如,声明selectedCard属性,以及与collectionViewAC相关联的collectionViewArrayController出口属性。现在,您可以通过selectedObjects获取所需的卡片项目。

- (id)selectedCard
{
    id selectedCards = [collectionViewAC selectedObjects];
    if ([selectedCards count]) {
        return [selectedCards objectAtIndex:0];
    }
    return nil;
}

使用绑定可以保持所有观察和更新。