Пользовательский UIMenuItem отображается только в первый раз

Я добавил настраиваемое меню в метод - (void)viewDidLoad моего контроллера представления:

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];

В том же контроллере я также реализую метод:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(readSelectedText)) {
        if (textView.selectedRange.length > 0) {
            return YES;
        }
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}

В первый раз, когда я выделяю какой-то текст, в меню есть пункт «Прочитать выбранное», и все работает хорошо. Однако при последующих выделениях текста меню содержит только стандартные элементы системного меню, такие как копирование. вставить и т. д. Я проверил метод - (BOOL)canPerformAction:(SEL)action withSender:(id)sender, и он никогда не вызывается с действием readSelectedText (как в первый раз).

Есть идеи, почему это происходит?


person pajevic    schedule 29.11.2012    source источник


Ответы (3)


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

- (недействительно) viewDidLoad {[супер viewDidLoad];

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

}

- (void) menuDidShow {

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

}

- (void) menuWillShow {

UIMenuItem *shareMenu = [[UIMenuItem alloc] initWithTitle:@"微博分享" action:@selector(shareToWeibo:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:shareMenu, nil]];

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];

[меню setTargetRect: selectedRect inView: self.view]; // должен быть установлен, иначе расположение меню никогда не изменится

[menu setMenuVisible:YES animated:YES];

}

person qiufangzhou    schedule 06.12.2012
comment
Спасибо, это помогло мне решить проблему. Но я немного упростил ваше предложение и опубликовал решение в качестве альтернативного ответа. Не знаю насчет твоего дела, но для меня этого было достаточно. - person pajevic; 06.12.2012
comment
Я добавляю настраиваемый пункт меню в UIWebView. Если я не устанавливаюMenuVisible самостоятельно (просто setMenuItems). Пользовательский элемент все еще не отображается. - person qiufangzhou; 06.12.2012

Мое решение основано на предложении qiufangzhou, поэтому кредиты и принятый ответ достаются ему.

Так или иначе, я подписался на UIMenuControllerWillShowMenuNotification нормирование в моем viewDidLoad методе:

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

Затем я реализовал этот метод:

-(void)menuWillShow{
    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
    [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
}

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

person pajevic    schedule 06.12.2012

Для кого это еще может понадобиться:

Нам не нужно больше ничего наблюдать за UIMenuControllerDidHideMenuNotification.

viewDidApear:

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

viewDidDisapear:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];

menuDidHide

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
person Mohammad Azhdari    schedule 14.03.2016