在显示之前将动态自定义 UIMenuItem 添加到复制和粘贴菜单
Posted
技术标签:
【中文标题】在显示之前将动态自定义 UIMenuItem 添加到复制和粘贴菜单【英文标题】:Adding a dynamic custom UIMenuItem to Copy & Paste Menu before it shows 【发布时间】:2010-10-12 14:16:16 【问题描述】:我已经成功地将自定义 UIMenuItem 添加到我的 iPhone 应用程序的复制和粘贴菜单中,甚至将 UITextView 子类化以摆脱标准菜单项.但是,我需要做的是在菜单实际发生之前以某种方式捕获菜单将要显示的事实,并将插入点处的单词添加到菜单中。
例如,如果 UITextView 中的文字是“This is a test.”,而人触摸了单词“is”,它会将该词作为 UIMenuItem 添加到 UIMenuController。
重要的是,菜单仅在被触摸后才直接显示单词。菜单的下一次调用将显示下一个触摸的单词,等等。触摸菜单中的单词将显示更多细节。我已经有代码可以根据 selectedRange 找到所触碰的单词。我需要做的就是在菜单显示之前将该词添加为 UIMenuItem。另一个不太优雅的解决方案可能是允许用户触摸静态菜单项,然后根据所触摸的单词添加并重新显示菜单,并使用不同的选项。
我希望有一种方法可以拦截 UIMenuController,可能是通过子类化它,这样我就可以在气球显示之前到达插入点,但仍然能够对它,通过更改菜单项列表。
有没有办法做到这一点?任何人都可以给我看一个代码 sn-p 或指向一些可能对我有帮助的文档吗?谢谢。
我唯一的其他解决方案是以某种方式创建我自己的气球并以某种方式禁用复制和粘贴菜单。我宁愿不必尝试。
【问题讨论】:
【参考方案1】:在某处启动时:
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
【讨论】:
rpetrich - 这是添加自定义 UIMenuItem 的标准方法。我已经有了那个代码。但是,我无法根据触摸的 selectedRange 在运行时拦截触摸以更改菜单项。 在你UITextViewDelegate
中实现textViewDidChangeSelection:
;在内部更新UIMenuItem
的title
属性以表示按钮应该具有选择的标题。或者,可以在canPerformAction:withSender:
中更新菜单项的标题,但我不会指望这一点。【参考方案2】:
如果问题仍然相关,那么您可以使用UIMenuControllerWillShowMenuNotification
或UIMenuControllerDidShowMenuNotification
通知。
请参阅documentation here。
代码示例:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShowMenu:) name:UIMenuControllerWillShowMenuNotification object:nil];
【讨论】:
以上是关于在显示之前将动态自定义 UIMenuItem 添加到复制和粘贴菜单的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UIMenuItem 不适用于 PDFKit 的 PDFView
为特定的 UITextView 添加 UIMenuItem?