7

我开发了一个应用程序的Mac OS X狮子使用其新的基于视图的NSTableView,但因为我想将整个应用程序移植到雪豹,我试图找出模拟这种tableview的最佳方式。到目前为止,我创建了一个NSCollectionView,并且一切都很好,除了我无法获取触发按钮单击事件的视图的索引。 在狮子,我有以下功能:获取NSCollectionView中视图的索引?

- (IBAction)buttonClick:(id)sender 

,所以我可以使用一种方法的实现代码如下内部视图索引(我不记得它的名字)喜欢

- (NSInteger)rowForView:(NSView *)aView 

与aView作为发件人的上海华盈,但我无法找到集合视图类似的东西......唯一的“有用”的方法似乎是

- (NSCollectionViewItem *)itemAtIndex:(NSUInteger)index 

(或像这样),但这不能帮助我,因为它返回一个NSCollectionViewItem,我甚至不能访问它只知道相应的视图!

回答

4

在buttonClick,试试这个代码:

id collectionViewItem = [sender superview]; 
NSInteger index = [[collectionView subviews] indexOfObject:collectionViewItem]; 
return index; 

希望这有助于:)

+1

我不能相信它,它似乎工作!我不确定这是否是最好的解决方案(苹果应该已经实现了一个更好的方法),但无论如何,这解决了我的问题。非常感谢! – Nickkk

+1

一句警告:一旦视图项目被重新排序(例如,如果您支持通过拖放重新排列),此操作不再有效。 – Mark

1

如何像:

id obj = [collectonViewItem representedObject]; 
NSInteger index = [[collectionView contents] indexOfObject:obj]; 
+0

就像我说的,我不能访问collectonViewItem只知道代表它的视图... – Nickkk

2

Geesh!这两种方法都有问题。我可以看到第一个如何工作,但请注意,“collectionViewItem”实际上是视图,而不是collectionViewItem,它是一个视图控制器。

第二种方法将无法正常工作,除非您将该按钮子类化并放入到collectionViewItem的反向链接中。否则,你的视图不知道什么collectionViewItem控制它。您应该使用一个选择器绑定到collectionViewItem的representObject上,以将操作获取到数组中的正确对象。

0

正如我这里建议:How to handle a button click from NSCollectionView

我会做这样的(因为要按下按钮应与相应的模型,因此表示的对象连接):

  1. 添加方法到您的collectionViewItem的模型(例如buttonClicked)
  2. 将按钮目标绑定到集合查看项目
  3. 绑定设置模型关键路径为:representObject
  4. 将绑定的选择器名称设置为:您之前选择的methodname(例如, buttonClicked)
  5. 添加协议模型,如果你一定要告诉委托或建立观察者模式
0
  1. 使用NSArrayController的结合NSCollectionView,

  2. 使用collectonViewItem.representedObject获得自定义模型由你自己定义。

  3. 保存并获取您的自定义模型中的索引。

这对我很有用。