将动态自定义UIMenuItem添加到Copy&在显示之前粘贴菜单

时间:2010-10-12 14:16:16

标签: iphone uimenucontroller

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

例如,如果 UITextView 中的文字是“这是一个测试。”,并且该人触及“这个词就是”,它会将该单词作为 UIMenuItem 添加到 UIMenuController

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

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

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

我唯一的另一个解决方案是以某种方式创建自己的气球,并以某种方式禁用Copy& amp;粘贴菜单。我宁愿不必尝试。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果问题仍然存在,那么您可以使用UIMenuControllerWillShowMenuNotificationUIMenuControllerDidShowMenuNotification通知 请参阅documentation here

代码示例:

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