0

我是 Cocoa 开发的新手,所以很多概念对我来说都不是很清楚......我正在尝试构建一个简单的应用程序,它将使用 Flickr API 来检索用户照片集并通过单击它们在 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 文件中设置为文件所有者。当 NSCollectionView 加载时,视图将自动加载。

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

如果我编写 NSView 的子类并制作视图对象的自定义类,我可以获得鼠标按下。但是,我无法通过这种方法获得 NSMutableArray 的代表对象和索引,它们是我需要的基本信息。

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

https://github.com/jasonlu/flickerBackupTool

谢谢!

更新

我发现解决这个问题的一种方法是通过继承 NSView 并实现 mousedown 并使用超级、子视图来获取和索引以及数组本身

- (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]);
}

这似乎可行,但如果这是最佳做法,我不起诉,它看起来过于依赖视图并且需要很长时间才能到达阵列。

4

1 回答 1

2

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

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

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

于 2014-01-12T01:26:45.177 回答