Quiero mostrar 2 opciones como «hola» & «adiós» cuando el usuario completa selección de UIWebView.

He añadido observador a mi punto de vista controlador de la siguiente manera. Pero no sé aplicación ulterior.

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

2 Comentarios

  1. 44

    Sagar,

    Tu pregunta es de hace un par de meses, pero finalmente me di cuenta de esto a uno, así que pensé que había que responder en caso de ayuda a alguien más.

    He añadido el siguiente código a la viewDidAppear: método de la vista controlador que contiene el webview.

    - (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]];
    }

    En mi viewDidDisappear:, me vaya por delante y eliminar esos elementos:

    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
    
        [[UIMenuController sharedMenuController] setMenuItems:nil];
    }

    Entonces, he implementado la canPerformAction:withSender: método en el controlador de vista. Ayuda a entender el concepto de los socorristas y del respondedor de cadenas para entender lo que está pasando aquí. Básicamente, su uiviewcontroller es parte del respondedor de la cadena, por lo que se le preguntó si se puede controlar las acciones (como tus acciones personalizadas que agregó anteriormente) que los objetos más arriba, el respondedor de la cadena (como el UIWebView) no sabe cómo manejar (ver el UIResponder documentación y la La gestión de eventos Guía para iOS para los detalles escabrosos).

    Ahora, cuando canPerformAction:withSender: es llamado por el webview, el remitente parámetro se ajusta a cero. Así que trataré de ser un poco inteligentes acerca de cómo escribo esta función. Básicamente, estoy seguro de que el remitente es nula, estoy mostrando el webview para el usuario, y cualquier otros controles de la página no son los primeros en responder. Si ese es el caso, entonces puedo comprobar si esta es una de las acciones que he definido anteriormente y retur SÍ, si lo es. En todos los demás casos, me devuelven el valor predeterminado de UIViewController llamando el mismo método en el 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];
    }

    Por supuesto, ahora el siguiente paso es averiguar cómo realmente hacer algo con la selección (probablemente mediante la ejecución de JavaScript en el webview).

    • Usted puede todavía premio mí una recompensa si quieres 🙂
    • He quitado la verificación del remitente == nil debido a que las futuras versiones de iOS podría establecer remitente a algo distinto de nil
    • Me gustaría invitar a usted a contestar esta pregunta, stackoverflow.com/questions/31183894/…
    • Me gustaría invitar a usted a contestar esta pregunta, stackoverflow.com/questions/31183894/…
    • ¿qué es urlTextField aquí?
  2. 3

    En swift:

    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")
        }
    }

    Nota: #selector está disponible en Swift 2.2.

    mostrando menú personalizado de selección en UIWebView en iphone

Dejar respuesta

Please enter your comment!
Please enter your name here