我是 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]);
}
这似乎可行,但如果这是最佳做法,我不起诉,它看起来过于依赖视图并且需要很长时间才能到达阵列。