Подтвердить что ты не робот

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

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

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

[[UIMenuController sharedMenuController] addObserver:self 
                                          forKeyPath:UIMenuControllerWillShowMenuNotification
                                             options:nil
                                             context:nil
 ];
4b9b3361

Ответ 1

Сагар,

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

Я добавил следующий код в 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]];
}

В моем представленииDidDisappear:, Я продолжаю и удаляю эти элементы:

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

    [[UIMenuController sharedMenuController] setMenuItems:nil];
}

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

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

- (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 в веб-просмотре).

Ответ 2

В быстрой:

class ViewController: UIViewController {
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        // add two custom menu items to the context menu of UIWebView (assuming in contenteditable mode)
        let menuItem1 = UIMenuItem(title: "Foo", action: #selector(ViewController.foo))
        let menuItem2 = UIMenuItem(title: "Bar", action: #selector(ViewController.bar))
        UIMenuController.sharedMenuController().menuItems = [menuItem1, menuItem2]
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidAppear(animated)
        UIMenuController.sharedMenuController().menuItems = nil
    }

    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        if webView?.superview != nil {
            if action == #selector(ViewController.foo) || action == #selector(ViewController.bar) {
                return true
            }
        }

        return super.canPerformAction(action, withSender: sender)
    }

    func foo() {
        print("foo")
    }

    func bar() {
        print("bar")
    }
}

Примечание: #selector доступен в Swift 2.2.

screenshot