2012-01-06 30 views
6

我試圖使用UIMenuCnotroller來顯示動態生成的項目列表,它們共享相同的操作方法,因此我需要知道在單一操作方法中選擇哪個項目。iOS:如何從UIMenuController中獲取所選的UIMenuItem

但是,在動作方法- (void)menuItemAction:(id)sender;發件人實際上是UIMenuController對象,並且我沒有找到任何方法UIMenuController可以告訴我哪個menuitem被選中。

一個解決方案,我能想到的是動態生成不同的操作選擇不同的項目,並在forwardInvocation

做一些技巧,但是有沒有更簡單的方法?

回答

1

好的,我已經解決了這個問題。它涉及到[NSObject forwardInvocation:]的混亂,並且有點髒,但是生成的代碼非常少。回答在這裏:https://stackoverflow.com/a/9874092/790036

+0

是的,最終我採取了類似的解決方案。 – 2012-04-09 14:18:38

2

您可以使用UIMenuCnotroller像: 1)創造:

UIMenuController *menuController = [UIMenuController sharedMenuController]; 
     UIMenuItem *open = [[UIMenuItem alloc] initWithTitle:@"Open" action:@selector(open:)]; 
     UIMenuItem *reDownload = [[UIMenuItem alloc] initWithTitle:@"Re-Download" action:@selector(reDownload:)]; 

     [menuController setMenuItems:[NSArray arrayWithObjects:open, reDownload, nil]]; 
     [menuController setTargetRect:cell.frame inView:self.view]; 
     [menuController setMenuVisible:YES animated:YES]; 

     [open release]; 
     [reDownload release]; 

2)爲了趕上行動應執行下一個方法:

- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender 
{ 
    if (selector == @selector(open:)) 
    { 
     return YES; 
    } 

    if (selector == @selector(reDownload:)) 
    { 
     return YES; 
    } 

    return NO; 
} 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

3)和實現你的方法:

- (void) open:(id) sender 
{ 
    [self doSomething]; 
} 

- (void) reDownload:(id) sender 
{ 
[self doSomething]; 
} 

希望,這有助於。

+0

感謝。這與我所需要的不同,在我的情況下,這兩個菜單項要分割相同的動作。例如,將兩個文件名放到兩個菜單項中,然後它們將共享相同的 - (void)open:(id)sender – 2012-01-09 04:45:46

+0

是的,但是您可以在不同的操作方法中實現相同的方法。換句話說,有2個項目和2個不同的行動。在每個行動的主體中,您可以定義已選擇的項目並調用分享方法。 – Igor 2012-01-09 08:37:28

+0

僅以打開的文件爲例,假設我們要顯示一個菜單,其中的每個菜單項在應用程序的文檔文件夾中顯示一個文件名,然後點擊它將加載該文件。在這種情況下,我們不知道在運行之前應該顯示多少文件,所以我們不能爲不同的菜單項分配不同的方法,除非使用假選擇器並利用[NSObject forwardInvocation:] – 2012-01-09 23:00:57

1

一個最簡單的方法是使用不同的方法@selector每個菜單項

例子:

UIMenuItem *oneObj = [[UIMenuItem alloc] initWithTitle:@"One" action:@selector(One:)]; 

UIMenuItem *twoObj = [[UIMenuItem alloc] initWithTitle:@"Two" action:@selector(Two:)]; 
+1

您不應該使變量名稱或方法名稱大寫。 – 2016-01-22 22:04:08

+0

現在我已經應用了命名約定 – 2016-01-25 09:24:37

相關問題