iOS: как получить выбранный UIMenuItem из UIMenuController - PullRequest
6 голосов
/ 06 января 2012

Я пытаюсь использовать UIMenuCnotroller, чтобы показать список динамически генерируемых элементов, они используют один и тот же метод действия, и поэтому мне нужно знать, какой элемент выбран в методе с одним действием.

Однако в методе действия - (void)menuItemAction:(id)sender; отправитель на самом деле является UIMenuController объектом, и я не нашел ни одного метода UIMenuController, который мог бы сказать мне, какой пункт меню выбран.

Одно решение, которое я могу придумать, - это динамически генерировать разные селекторы действий для разных предметов и выполнять некоторые трюки в forwardInvocation

Но есть ли более простой способ?

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Вы можете использовать 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];
}

Надеюсь, это поможет.

1 голос
/ 09 августа 2013

Самый простой способ - использовать разные методы @selector для каждого пункта меню

Примеры:

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

UIMenuItem *twoObj = [[UIMenuItem alloc] initWithTitle:@"Two" action:@selector(Two:)];
1 голос
/ 26 марта 2012

Хорошо, я решил это. Он включает в себя работу с [NSObject forwardInvocation:] и немного грязный, но результирующий код довольно минимален. Ответили здесь: https://stackoverflow.com/a/9874092/790036

...