2012-04-19 38 views
0

我正在使用NSMenu應用程序停靠菜單)和其中的幾個項目具有相同的操作。獲取父菜單中NSMenuItem(發件人)的索引

如何計算容器菜單中的發件人項目(觸發操作的項目)的索引? (我在title中並不感興趣,因爲這可能是重複的)

這就是我試過的,但它一直返回0(零)。

- (void)myAction:(id)sender 
{ 
    NSMenuItem* mi = (NSMenuItem*)sender; 

    int index = [[[mi parentItem] submenu] indexOfItem:mi]; 

    NSLog(@"Clicked item with index : %d",index); 
} 

任何想法? (有沒有更好的方法來達到同樣的效果?)

+0

爲什麼不能有不同的菜單項調用不同的行動? – 2012-04-19 07:43:07

+0

@RobKeniger那麼,菜單是動態填充變量內容(和可變數量的元素)......它們將以某種類似的方式處理......(實際上是活動文檔名稱的列表 - 以非傳統基於文檔的應用程序) – 2012-04-19 08:05:20

回答

3

您可以使用菜單項「representedObject」來存儲對應用程序中某個對象的引用。在你的情況,你可能會使用該菜單項指的是文件:

[aMenuItem setRepresentedObject:yourDocument]; 

然後,您可以訪問該對象的動作,像這樣:

- (void)myAction:(id)sender 
{ 
    NSMenuItem* mi = (NSMenuItem*)sender; 
    YourDocument* doc = (YourDocument*)[sender representedObject]; 
    //do something with doc 
} 
+0

有趣的想法;儘管我仍然必須徹底改變我的菜單人口慣例背後的邏輯。我可能會試試它!非常感謝! ;-) – 2012-04-19 08:19:30

+0

我最終通過在創建時將'index'數字傳遞給每個'NSMenuItem'的keyEquivalent屬性來實現它。 ;-) – 2012-04-19 09:12:42

+4

這是濫用'keyEquivalent'的。如果你只是想要索引,那麼最好將索引存儲爲'NSNumber',然後將該'NSNumber'對象存儲爲菜單項目'representObject'。 – 2012-04-19 10:27:43

相關問題