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

iOS:如何从UIMenuController获取选定的UIMenuItem,ios,menu,uimenucontroller,Ios,Menu,Uimenucontroller,我试图使用UIMenuCnotroller显示动态生成的项目列表,它们共享相同的操作方法,因此我需要知道在单个操作方法中选择了哪个项目 但是,在action方法-(void)menuiteAction中:(id)sender发送方实际上是UIMenuController对象,我没有找到UIMenuController可以告诉我选择了哪个menuitem的任何方法 我能想到的一个解决方案是为不同的项目动态生成不同的操作选择器,并在forwardInvocation 但是有更简单的方法吗?您可以使用

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

但是,在action方法
-(void)menuiteAction中:(id)sender
发送方实际上是
UIMenuController
对象,我没有找到
UIMenuController
可以告诉我选择了哪个menuitem的任何方法

我能想到的一个解决方案是为不同的项目动态生成不同的操作选择器,并在
forwardInvocation


但是有更简单的方法吗?

您可以使用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];
}

希望,这有帮助。

好的,我已经解决了这个问题。它会弄乱[NSObject forwardInvocation:],有点脏,但生成的代码非常少。在这里回答:

一个最简单的方法是对每个菜单项使用不同的
@selector
方法

示例:

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

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

谢谢这与我需要的不同,在我的例子中,两个菜单项想要切分相同的动作。例如,将两个文件名放在两个菜单项上,然后它们将共享相同的-(void)open:(id)senderies,但您可以在不同的操作方法中实现相同的方法。换句话说,它有两个项目和两个不同的动作。在每个Acton的主体中,您可以定义选择了哪些项目并调用共享方法。仅以打开文件为例,假设我们要显示一个菜单,其中每个项目在应用程序的文档文件夹中显示一个文件名,点击它将加载文件。在这种情况下,我们不知道在运行之前应该显示多少文件,因此我们不能为不同的菜单项分配不同的方法,除非使用假选择器并利用[NSObject forwardInvocation:]Hi-krock。当选择“从菜单项复制、剪切或粘贴”时,我要截取。。Iam在CanPerformation方法中使用选择器copy:、paste:和cut:,但它不起作用。任何线索……是的,最终我采用了类似的解决方案。你不应该大写变量名或方法名。现在我已经应用了命名约定