2012-11-29 41 views
2

我增加了一個自定義菜單在我的視圖控制器的- (void)viewDidLoad方法:定製UIMenuItem僅表現爲第一次

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)]; 
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem]; 

在同一個控制器我也實現方法:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (action == @selector(readSelectedText)) { 
     if (textView.selectedRange.length > 0) { 
      return YES; 
     } 
     return NO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

第一我選擇一些文本菜單中包含「讀取選定」菜單項,它都運行良好。但是在隨後的文本選擇中,菜單隻包含標準系統菜單項,如複製。粘貼等。我已經檢查了- (BOOL)canPerformAction:(SEL)action withSender:(id)sender方法,並且它永遠不會被readSelectedText動作調用(因爲它是第一次)。

任何想法爲什麼發生這種情況?

回答

1

我試過了下面的代碼,它對我有用。點是菜單顯示之前,添加自定義菜單項,然後自己顯示菜單。

- (void)viewDidLoad { [super viewDidLoad];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidShow) name:UIMenuControllerDidShowMenuNotification object:nil]; 

}

- (無效)menuDidShow {

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil]; 

}

- (無效)menuWillShow {

UIMenuItem *shareMenu = [[UIMenuItem alloc] initWithTitle:@"微博分享" action:@selector(shareToWeibo:)]; 
UIMenuController *menu = [UIMenuController sharedMenuController]; 
[menu setMenuItems:[NSArray arrayWithObjects:shareMenu, nil]]; 

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil]; 

[菜單setTargetRect:selectedRect inView: self.view]; //必須設置的,否則菜單位置從未改變

[menu setMenuVisible:YES animated:YES]; 

}

+0

謝謝你,幫我解決是起訴。但是我已經簡化了你的建議併發布瞭解決方案作爲替代答案。我不知道你的情況,但對我來說這已經足夠了。 – pajevic

+0

我正在UIWebView上添加自定義菜單項。如果我不自己設置菜單可見(只是setMenuItems)。自定義項目仍不可見。 – qiufangzhou

1

我的解決方案是基於qiufangzhou提供這樣的信貸和接受的答案去了他的建議。

不管怎麼說,我最終簽約了UIMenuControllerWillShowMenuNotification noritication在我viewDidLoad方法:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil]; 

然後,我實現了這個方法:

-(void)menuWillShow{ 
    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)]; 
    [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem]; 
} 

的技巧是,你必須添加自定義菜單每當菜單被推動時,不僅一次。我猜想每次都會清除自定義菜單項目列表。

0

對於誰可能仍然需要這樣的:

我們需要觀察UIMenuControllerDidHideMenuNotification沒有別的。

viewDidApear:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidHide) name:UIMenuControllerWillShowMenuNotification object:nil]; 

viewDidDisapear:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil]; 

menuDidHide

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)]; 
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem]; 
相關問題