показ пользовательского меню на выборе в UIWebView в iPhone

Я хочу показать 2 варианта как "привет" и "до свидания" когда пользователь завершает выбор на UIWebView.

Я добавил наблюдателя к своему контроллеру представления следующим образом. Но я не знаю дальнейшую реализацию.

[[UIMenuController sharedMenuController] addObserver:self 
                                          forKeyPath:UIMenuControllerWillShowMenuNotification
                                             options:nil
                                             context:nil
 ];
20
задан halfer 16 January 2018 в 19:55
поделиться

1 ответ

Sagar,

Вашему вопросу уже несколько месяцев, но я, наконец, разобрался с этим, поэтому решил ответить на него, если он поможет кому-то еще.

Я добавил следующий код в метод viewDidAppear: контроллера представления, содержащего веб-представление.

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    UIMenuItem *customMenuItem1 = [[[UIMenuItem alloc] initWithTitle:@"Custom 1" action:@selector(customAction1:)] autorelease];
    UIMenuItem *customMenuItem2 = [[[UIMenuItem alloc] initWithTitle:@"Custom 2" action:@selector(customAction2:)] autorelease];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:customMenuItem1, customMenuItem2, nil]];
}

В моем viewDidDisappear: я удаляю эти элементы:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [[UIMenuController sharedMenuController] setMenuItems:nil];
}

Затем я реализовал метод canPerformAction:withSender: в контроллере представления. Это помогает понять концепцию ответчиков и цепочек ответчиков, чтобы понять, что здесь происходит. По сути, ваш uiviewcontroller является частью цепочки респондентов, поэтому его спрашивают, может ли он обрабатывать какие-либо действия (например, ваши настраиваемые действия, которые вы добавили выше), которые объекты выше по цепочке респондентов (например, UIWebView) не знают, как обрабатывать ( см. документацию UIResponder и Руководство по обработке событий для iOS для подробностей).

Теперь, когда canPerformAction:withSender: вызывается для веб-просмотра, параметр sender устанавливается равным nil. Итак, я стараюсь быть немного умнее в том, как я пишу эту функцию. По сути, я удостоверяюсь, что отправитель равен нулю, я показываю веб-просмотр пользователю, и любые другие элементы управления на странице не являются первым ответчиком. Если это так, то я проверяю, является ли это одним из действий, которые я определил выше, и возвращаю YES, если это так. Во всех остальных случаях я возвращаю значение по умолчанию из UIViewController, вызывая тот же метод в super.

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (webView.superview != nil && ![urlTextField isFirstResponder]) {
        if (action == @selector(customAction1:) || action == @selector(customAction2:)) {
            return YES;
        }
    }

    return [super canPerformAction:action withSender:sender];
}

Конечно, теперь следующим шагом является выяснение того, как на самом деле что-то делать с выбором (вероятно, запустив какой-нибудь JavaScript в веб-просмотре).

44
ответ дан 29 November 2019 в 23:27
поделиться