iOS:如何从 UIMenuController 获取选定的 UIMenuItem

Posted

技术标签:

【中文标题】iOS:如何从 UIMenuController 获取选定的 UIMenuItem【英文标题】:iOS: How to get the selected UIMenuItem from UIMenuController 【发布时间】:2012-01-06 10:47:13 【问题描述】:

我正在尝试使用UIMenuCnotroller 显示动态生成的项目列表,它们共享相同的操作方法,因此我需要知道在单个操作方法中选择了哪个项目。

但是,在- (void)menuItemAction:(id)sender;action方法中,sender实际上是UIMenuController对象,我没有找到UIMenuController的任何方法可以告诉我选择了哪个菜单项。

我能想到的一个解决方案是为不同的item动态生成不同的动作选择器,在forwardInvocation中做一些小技巧

但是有没有更简单的方法?

【问题讨论】:

【参考方案1】:

您可以像这样使用 UIMenuCnotroller: 1) 创作:

UIMenuController *menuController = [UIMenuController sharedMenuController];
        UIMenuItem *open = [[UIMenuItem alloc] initWithTitle:@"Open" action:@selector(open:)];
        UIMenuItem *reDownload = [[UIMenuItem alloc] initWithTitle:@"Re-Download" action:@selector(reDownload:)];

        [menuController setMenuItems:[NSArray arrayWithObjects:open, reDownload, nil]];
        [menuController setTargetRect:cell.frame inView:self.view];
        [menuController setMenuVisible:YES animated:YES];

        [open release];
        [reDownload release];

2) 捕捉动作应该实现下一个方法:

- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender 

    if (selector == @selector(open:))
    
        return YES;
    

    if (selector == @selector(reDownload:))
    
        return YES;
    

    return NO;


- (BOOL) canBecomeFirstResponder 

    return YES;

3) 并实现你的方法:

- (void) open:(id) sender 

    [self doSomething];


- (void) reDownload:(id) sender 

[self doSomething];

希望,这会有所帮助。

【讨论】:

谢谢。这与我需要的不同,在我的情况下,两个菜单项想要分片相同的操作。例如,将两个文件名放在两个菜单项中,那么它们将共享相同的 -(void)open:(id)sender 是的,但是你可以在不同的action方法中实现相同的方法。换句话说,有 2 个项目和 2 个不同的操作。在每个动作的正文中,您可以定义已选择的项目并调用共享方法。 以打开文件为例,假设我们要显示一个菜单,每个菜单项显示应用程序文件夹中的文件名,点击它会加载文件。在这种情况下,我们不知道在运行之前应该显示多少文件,因此我们不能为不同的菜单项分配不同的方法,除非使用假选择器并利用 [NSObject forwardInvocation:] 嗨,克罗克。我想在选择菜单项的复制、剪切或粘贴时进行拦截。我在 canPerformAction 方法中使用选择器 copy: 、 paste: 和 cut: ,但它不起作用。任何线索..【参考方案2】:

好的,我已经解决了这个问题。它涉及弄乱 [NSObject forwardInvocation:] 并且有点脏,但生成的代码非常少。在这里回答:https://***.com/a/9874092/790036

【讨论】:

是的,最终我采取了类似的解决方案。【参考方案3】:

一种最简单的方法是对每个菜单项

使用不同的@selector 方法

示例:

UIMenuItem *oneObj = [[UIMenuItem alloc] initWithTitle:@"One" action:@selector(One:)];

UIMenuItem *twoObj = [[UIMenuItem alloc] initWithTitle:@"Two" action:@selector(Two:)];

【讨论】:

变量名或方法名不能大写。 现在我已经应用了命名约定

以上是关于iOS:如何从 UIMenuController 获取选定的 UIMenuItem的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 5 中隐藏 UIMenuController

iOS苹果自带UIMenuController

IOS UIMenuController UIMenuItem,如何确定使用通用选择器方法选择的项目

在 iOS 的 UIMenuController 开头附加自定义 UIMenuItems

如何从 UIMenuController 中删除粘贴?

您如何真正从 UIMenuController 中删除 Copy