2010-10-12 62 views
4

我已成功能够自定义UIMenuItem在我的iPhone应用程序添加到复制&粘贴菜单,甚至子类的UITextView摆脱的标准菜单项。但是,我需要做的是以某种方式捕获菜单将在实际发生之前显示的事实,并将该插入点处的单词添加到菜单中。添加自定义动态UIMenuItem复制和粘贴菜单才显示

例如,如果UITextView中的文本是“这是测试”。,并且该人碰到单词“是”,它会将该单词作为UIMenuItem添加到UIMenuController

重要的是,菜单仅在触摸后才显示该字词。下一次菜单调用将显示下一个被触摸的单词等。触摸菜单中的单词将显示更多细节。我已经有了代码,可以根据selectedRange找到所触及的单词。我需要做的就是在菜单显示之前将该单词添加为UIMenuItem。另一个较不优雅的解决方案可能是让用户触摸静态菜单项,然后根据所触及的单词添加并重新显示具有不同选项的菜单。

我希望有拦截UIMenuController的方式,可能是通过继承它,这样我可以将插入点气球显示器前,但仍然能够以实现改变它,通过改变菜单项目列表。

有没有办法做到这一点?任何人都可以给我看一段代码片段,或者向我指出一些可能对我有帮助的文档吗?谢谢。

我唯一的解决方法是以某种方式创建我自己的气球,并以某种方式禁用复制粘贴菜单。我宁愿不必尝试。

回答

5

在启动时地方:

UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)]; 
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:testMenuItem]; 
[testMenuItem release]; 

而在你UITextViewUITextField子类:

@implementation MyTextView 
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (action == @selector(test:)) { 
     // Return YES only if it's possible to perform the action at this time 
     return YES; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 
- (void)test:(id)sender { 
    // Perform the action here 
} 
@end 
+0

rpetrich - 那就是添加自定义UIMenuItem的标准方式。我已经有了这个代码。但是,根据触摸的选定范围,我无法在运行时拦截触摸来更改菜单项。 – user472938 2010-10-12 16:50:46

+2

在你的'UITextViewDelegate'中实现'textViewDidChangeSelection:';在里面更新'UIMenuItem'的'title'属性来表示按钮应该给出选择的标题。或者,可以在'canPerformAction:withSender:'内更新菜单项的标题,但我不会指望这一点。 – rpetrich 2010-10-13 11:07:40

0

如果问题仍然是相关的,那么你可以使用UIMenuControllerWillShowMenuNotificationUIMenuControllerDidShowMenuNotification通知。
查看documentation here

代码示例:

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