单击NSCollectionViewItem的视图

时间:2013-11-12 01:07:46

标签: cocoa mouseevent mousedown nscollectionview nscollectionviewitem

我是Cocoa dev的新手,所以很多概念对我来说都不清楚...... 我正在尝试构建一个简单的应用程序,它将使用Flickr API检索用户photosets并在NSCollectionView中显示它们,通过单击它们,将开始下载照片集的照片。

我正在使用Xcode 5.0.1和最新的SDK,即10.9

在阅读了一些关于如何使用绑定来处理NSCollectionView的文章之后,我现在面临着另一个关于在NSCollectionViewItem中处理事件的问题。

根据我的理解,实现

可以轻松处理鼠标事件
-(void) mouseDown:(NSEvent *)theEvent

在NSView子类中,比如说

@interface MyViewController : NSView {
}

将视图自定义类分配给我在InterfaceBuilder中创建的子类(MyViewController)。

现在,我没有问题要做,如上所述,mousedown在大多数小部件中按预期处理。 问题是,我有一个NSCollectionViewItem子类如下:

@interface MyItemController : NSCollectionViewItem {
}

我正在尝试在那里实现mousedown方法,这个类在一个单独的nib文件中被设置为File的Owner。并且在加载NSCollectionView时将自动加载视图。

现在,MyItemController不能作为IB中视图对象的客户类,这显然是因为它不是NSView子类而是NSCollectionViewItem子类。

如果我编写NSView的子类并创建自定义视图对象类,我可以获得mousedown。 但是,我不能在这种方法中获得NSMutableArray的representObject和索引,它们是我需要的基本信息。

所以我的问题是,处理NSCollectionViewItem的鼠标事件视图的正确方法是什么? 我在GitHub中的代码:

https://github.com/jasonlu/flickerBackupTool

谢谢!

更新

我发现解决这个问题的方法是通过继承NSView并实现mousedown并使用super,subviews来获取和索引以及数组本身

- (void)mouseDown:(NSEvent *)theEvent  {
    NSCollectionView *myCollectionView = (NSCollectionView *)[self superview];
    NSInteger index = [[myCollectionView subviews]  indexOfObject:self];
    NSLog(@"collection view super view: %@",myCollectionView);
    NSLog(@"collection index: %ld",index);
    NSLog(@"array: %@", [[myCollectionView content] objectAtIndex:index]);
}

看起来很有效,但是如果这是最好的做法我就不会起诉,它看起来像取决于太多的视图而且花了很长时间才能到达阵列。

1 个答案:

答案 0 :(得分:2)

我不打赌NSCollectionView总是会创建所有子视图(远离查看区域的子视图可能会被延迟和/或重用)。因此,我不会依赖子视图搜索。

重载NSViewController以创建NSView,以便可以从NSView访问分配给NSViewController的representObject。从那里,您可以搜索实际内容以进行索引确定。

在视图创建期间重载NSCollectionView并记录实际索引可能不会很好,因为删除的项可能不会重新创建任何视图。