6

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

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

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

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

4

3 回答 3

2

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

希望这可以帮助。

于 2012-01-06T11:33:39.967 回答
1

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

于 2012-03-26T14:35:38.497 回答
1

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

例子:

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

UIMenuItem *twoObj = [[UIMenuItem alloc] initWithTitle:@"Two" action:@selector(Two:)];
于 2013-08-09T12:39:47.963 回答