我是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]);
}
看起来很有效,但是如果这是最好的做法我就不会起诉,它看起来像取决于太多的视图而且花了很长时间才能到达阵列。
答案 0 :(得分:2)
我不打赌NSCollectionView总是会创建所有子视图(远离查看区域的子视图可能会被延迟和/或重用)。因此,我不会依赖子视图搜索。
重载NSViewController以创建NSView,以便可以从NSView访问分配给NSViewController的representObject。从那里,您可以搜索实际内容以进行索引确定。
在视图创建期间重载NSCollectionView并记录实际索引可能不会很好,因为删除的项可能不会重新创建任何视图。