添加自定义动态UIMenuItem复制和粘贴菜单才显示
我已成功能够自定义UIMenuItem在我的iPhone应用程序添加到复制&粘贴菜单,甚至子类的UITextView摆脱的标准菜单项。但是,我需要做的是以某种方式捕获菜单将在实际发生之前显示的事实,并将该插入点处的单词添加到菜单中。添加自定义动态UIMenuItem复制和粘贴菜单才显示
例如,如果UITextView中的文本是“这是测试”。,并且该人碰到单词“是”,它会将该单词作为UIMenuItem添加到UIMenuController。
重要的是,菜单仅在触摸后才显示该字词。下一次菜单调用将显示下一个被触摸的单词等。触摸菜单中的单词将显示更多细节。我已经有了代码,可以根据selectedRange找到所触及的单词。我需要做的就是在菜单显示之前将该单词添加为UIMenuItem。另一个较不优雅的解决方案可能是让用户触摸静态菜单项,然后根据所触及的单词添加并重新显示具有不同选项的菜单。
我希望有拦截UIMenuController的方式,可能是通过继承它,这样我可以将插入点气球显示器前,但仍然能够以实现改变它,通过改变菜单项目列表。
有没有办法做到这一点?任何人都可以给我看一段代码片段,或者向我指出一些可能对我有帮助的文档吗?谢谢。
我唯一的解决方法是以某种方式创建我自己的气球,并以某种方式禁用复制粘贴菜单。我宁愿不必尝试。
在启动时地方:
UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:testMenuItem];
[testMenuItem release];
而在你UITextView
或UITextField
子类:
@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
如果问题仍然是相关的,那么你可以使用UIMenuControllerWillShowMenuNotification
或UIMenuControllerDidShowMenuNotification
通知。
查看documentation here。
代码示例:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShowMenu:) name:UIMenuControllerWillShowMenuNotification object:nil];
rpetrich - 那就是添加自定义UIMenuItem的标准方式。我已经有了这个代码。但是,根据触摸的选定范围,我无法在运行时拦截触摸来更改菜单项。 – user472938 2010-10-12 16:50:46
在你的'UITextViewDelegate'中实现'textViewDidChangeSelection:';在里面更新'UIMenuItem'的'title'属性来表示按钮应该给出选择的标题。或者,可以在'canPerformAction:withSender:'内更新菜单项的标题,但我不会指望这一点。 – rpetrich 2010-10-13 11:07:40