在显示之前,将动态自定义UIMenuItem添加到复制和粘贴菜单

use*_*938 4 iphone uimenucontroller

我已成功地将自定义UIMenuItem添加到我的iPhone应用程序中的"复制和粘贴"菜单中,甚至还将UITextView子类化为删除标准菜单项.但是,我需要做的是以某种方式捕获菜单将在实际发生之前显示的事实,并将插入点处的单词添加到菜单中.

例如,如果UITextView中的文本是"This is a test".并且该人触摸了"是"这个词,它会将该词作为UIMenuItem添加到UIMenuController中.

重要的是菜单只有在触摸后才能直接显示该单词.菜单的下一次调用将显示触摸的下一个单词等.然后触摸菜单中的单词将显示更多细节.我已经有了基于selectedRange查找触摸单词的代码.我需要做的就是在菜单显示之前将该单词添加为UIMenuItem.另一个不太优雅的解决方案可能是允许此人触摸静态菜单项,然后根据触摸的单词添加并重新显示菜单,具有不同的选项.

我希望有一种方法可以拦截UIMenuController,可能通过子类化它,这样我可以在气球显示之前到达插入点,但仍然可以通过更改菜单项列表来对其进行更改.

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

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

rpe*_*ich 5

在某处启动时:

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

在你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
Run Code Online (Sandbox Code Playgroud)

  • 在你的`UITextViewDelegate`中实现`textViewDidChangeSelection:`; inside更新`UIMenuItem`的`title`属性来表示按钮应该给出选择的标题.或者,也可以在`canPerformAction:withSender:`中更新菜单项的标题,但我不会指望它. (2认同)