отображение пользовательского меню на выбор в UIWebView в iphone - PullRequest
20 голосов
/ 02 июня 2010

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

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

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

Ответы [ 2 ]

44 голосов
/ 30 августа 2010

Сагар,

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

Я добавил следующий код в 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: в контроллере представления. Это помогает понять концепцию респондентов и цепочек респондентов, чтобы понять, что здесь происходит. По сути, ваш контроллер uiview является частью цепочки респондента, поэтому его спрашивают, может ли он обрабатывать какие-либо действия (например, ваши пользовательские действия, которые вы добавили выше), которые объекты выше в цепочке респондента (например, UIWebView) не знают, как их обрабатывать см. документацию UIResponder и Руководство по обработке событий для iOS для получения подробной информации).

Теперь, когда canPerformAction: withSender: вызывается для веб-просмотра, для параметра отправителя устанавливается значение nil. Итак, я пытаюсь быть немного умным в том, как я пишу эту функцию. По сути, я удостоверяюсь, что отправитель равен нулю, я показываю веб-просмотр пользователю, и любые другие элементы управления на странице не являются первым респондентом. Если это так, то я проверяю, является ли это одним из действий, которые я определил выше, и возвращаюсь ДА, если это так. Во всех других случаях я возвращаю значение по умолчанию из 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 в веб-представлении).

3 голосов
/ 16 марта 2016

В быстром:

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

...