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. 保存並獲取您的自定義模型中的索引。

這對我很有用。