¿Cómo se puede REALMENTE eliminar Copia de UIMenuController

Hay al parecer solía ser un manera fácil para evitar el «Más…» de la etiqueta que aparece en UIMenuController a la hora de agregar más de un elemento de menú personalizado. Sólo tenía que quitar todos los elementos de menú del sistema. Incluso hubo un solución aquí para todavía tener que copiar el trabajo. Sólo tenía que implementar una copia personalizada de comandos, utilizando una selección y, a continuación, reemplace canPerformAction:withSender: no mostrar el sistema de copia:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{
    if (action == @selector(copy:))
       return NO;
    else
       //logic to show or hide other things
}

Desafortunadamente, este método no funciona (al menos en un UIWebView subclase). canPerformAction:withSender: se llama para cada opción de menú sistema de excepción de copia: así, el resultado es que el sistema de copia elemento de menú se muestra siempre. Esto significa que si usted tiene más de un elemento de menú personalizado, que siempre están ocultos detrás de «Más…»

Es así, ¿hay una manera de quitar el sistema de copia del artículo o alguna alternativa para evitar que los elementos de menú de su escondite detrás de «Más…»?

Actualización

Esta es la salida que siento cuando voy a reemplazar canPerformAction:withSender: observe que el método nunca es llamado por el «copy:» la acción:

cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
can perform action customCopy: with sender <UIMenuController: 0x7227d30>.
can perform action custom1: with sender <UIMenuController: 0x7227d30>.
cannot perform action custom2: with sender <UIMenuController: 0x7227d30>.
can perform action custom3: with sender <UIMenuController: 0x7227d30>.
can perform action custom4: with sender <UIMenuController: 0x7227d30>.
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
  • Al parecer no hay forma de eliminar la copia de UIMenuController dentro de Objective-C, pero es posible mediante el uso de CSS: -webkit-user-select:none; iphonedevsdk.com/forum/iphone-sdk-development/…
  • Tal vez no fui lo suficientemente claro en el primer párrafo, pero no estoy tratando de evitar la selección del usuario. Estoy tratando de poner más de un elemento de menú personalizado en UIMenuController sin ser atrapado bajo el «Más…» en el menú. Usted solía ser capaz de hacer esto mediante la prevención de la Copia de comandos de muestra de hasta (stackoverflow.com/questions/4311009/…), pero que ya no funciona.
  • ¿qué quieres decir con «ya no funciona»? se rompió en iOS5 o algo?
  • Por «ya no funciona», me refiero a que la solución publicado aquí: stackoverflow.com/questions/3255070/… no funciona. Al parecer utiliza para. Otros (stackoverflow.com/questions/4311009/…) también han encontrado que esta solución no funciona. Como mencioné en mi actualización, el método reemplazado nunca se llama «copy:».
  • Hizo usted finalmente encontrar una solución para las versiones más recientes?
  • También se nota … stackoverflow.com/questions/19280119/…

InformationsquelleAutor lfalin | 2011-07-07

6 Kommentare

  1. 13

    La técnica vinculada a la todavía parece funcionar. He implementado un UIWebView subclase con estos métodos, y sólo el a y el B, artículos aparecían.

    + (void)initialize
    {
        UIMenuItem *itemA = [[UIMenuItem alloc] initWithTitle:@"A" action:@selector(a:)];
        UIMenuItem *itemB = [[UIMenuItem alloc] initWithTitle:@"B" action:@selector(b:)];
        [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:itemA, itemB, nil]];
        [itemA release];
        [itemB release];
    }
    
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        BOOL can = [super canPerformAction:action withSender:sender];
        if (action == @selector(a:) || action == @selector(b:))
        {
            can = YES;
        }
        if (action == @selector(copy:))
        {
            can = NO;
        }
        NSLog(@"%@ perform action %@ with sender %@.", can ? @"can" : @"cannot", NSStringFromSelector(action), sender);
        return can;
    }
    • Todavía estoy usando esta técnica y puede confirmar que funciona en iOS 4.3.2. No he probado iOS5 beta, sin embargo.
    • No, no no de trabajo en iOS5 por defecto de los selectores de como cortar, copiar, pegar, seleccionar, selectAll, definir, sugieren. Estos todavía se muestran incluso si yo NO volver. Esto no funciona en un UITextField ni en un UIWebView.
    • Puedo confirmar que funciona en mi aplicación, construido con la última iOS5 SDK que se ejecutan en iOS4 y iOS5. Puedo ocultar todos los predeterminados de copia/pegar elementos de menú y mostrar mi propia – todo en una costumbre UIWebView subclase.
    • Confirmó también. Funciona bien con XCode 4.2 y iOS 5.0.1, siempre que implemente la costumbre UIWebView subclase se define a continuación.
    • Estoy marcado esta respuesta como correcta, ya que parece que funciona para muchas personas, pero me gustaría saber por qué no funciona para mí y para otros.
    • ha añadido un control para cada defecto de los elementos de menú, yo.e cortar, copiar, pegar, seleccionar? Anterior fragmento de código sólo tiene copia: selector, así que creo que va a quitar sólo que no de los otros.
    • copia: es el único que estoy tratando de eliminar. El problema es que canPerformAction:withSender: nunca es llamado para la acción de copiar.
    • lfalin, estás en lo correcto. La respuesta es totalmente incorrecto. Cómo deshacerse de Copia y etc. los menús?
    • En UIWebView documentación, se mencionó que, «UIWebview no debería ser sub clases». ¿Es legal la subclase de ella?
    • Gracias @lemnar …guardó mi tiempo 🙂

  2. 7

    para ios >= 5.1 canPerformAction:(SEL)acción withSender:(id)sender ya no funciona.

    Si usted está bien con sólo desactivar la acción de pegar aquí es un método:

    agregar UITextFieldDelegate a ver y controlador de implementar el método como este

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    if(textField == txtEmailRe)
        return ((string.length) > 1 ? NO : YES);
    }

    significa que si el usuario introduce más de un personaje para cada acción (lo que significa que probablemente el usuario está pegando algo.) no la aceptan en el textfield.

    es una buena práctica para obligar a los usuarios entrar en campos de texto como el correo electrónico y

    • La mejor solución para esto, las manos hacia abajo!
    • canPerformAction funciona en IOS > 5.1. El problema es que su trato con el canPerformAction en el delegado de la clase. El canPerformAction se llama en el UITextField sí mismo, no en el delegado. En fin canPerformAction a trabajar debe reemplazar canPerformAction en un UITextField subclase.
  3. 3

    lemnar la respuesta es correcta. La implementación de una subclase de UIWebView funciona bien. Este ejemplo está bien para un UITextView. Para un UIWebView, crear una subclase de la siguiente manera:

    //
    // MyUIWebView.h
    //
    
    #import <UIKit/UIKit.h>
    
    @interface MyUIWebView : UIWebView
    
    @end

    Y:

    //
    // MyUIWebView.m
    //
    
    #import "MyUIWebView.h"
    
    @implementation MyUIWebView
    
    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
    {
        if (action == @selector(copy:))
            return NO;
        else
            //logic to show or hide other things
    }
    
    @end

    Entonces, en lugar de crear instancias UIWebView, uso MyUIWebView.

    ACTUALIZACIÓN:

    Si quieres deshabilitar la «copia», pero deje de «definir» (y «traducir»), el cual puede ser útil, esta es la forma de hacerlo; reemplazar canPerformAction:withSender anteriormente con este:

    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
    {
        if (action == @selector(defineSelection:))
        {
            return YES;
        }
        else if (action == @selector(translateSelection:))
        {
            return YES; 
        }
        else if (action == @selector(copy:))
        {
            return NO;
        }
    
        return [super canPerformAction:action withSender:sender];
    }
    • no, esto no no trabajar en iOS 5.0.1. Intentado, todavía no hay ninguna copia: selector en la canPerformAction: método.
    • Esto no se supone que habilitar la opción «copiar» en el menú, pero se desactive. Funciona perfectamente bien en iOS 5.0.1, siempre que usted siga las instrucciones dadas anteriormente.
    • Escribí «todavía no» de la copia:-selector’ en el canPerformAction: método». Eso significa, que la acción de copia nunca es enviado a este método de delegado, por lo que el canPerformAction-método nunca será capaz de volver NO. Eso significa que, de la copia no puede ser desactivada. De nuevo: no funciona con iOS 5.x. He probado varias veces en varias máquinas. La única forma en que funciona para usted, es cuando se tiene una edad de Xcode/versión del SDK, como se trabajaba antes. Edit: o eres tal vez no el uso de un UIWebView. Esta pregunta es acerca de UIWebview. La única solución de trabajo se describen a continuación (UIWebBrowserView categoría)
    • el auco, no estoy seguro de por qué usted no puede conseguir que funcione. Como se dijo anteriormente por @TomSwift y por mí mismo (Ver post anterior con la costumbre de la subclase MyUIWebView), funciona perfectamente en iOS 5.0.1 con XCode 4.2. La clase en cuestión es UIWebView, véase el ejemplo de arriba. Me gustaría agregar una captura de pantalla aquí, pero que iba a contaminar el post y añadir verborrea innecesaria.
  4. 3

    Aquí es una solución para iOS5.x que funciona para mí. Es por Josh Garnham, lo que sugiere la creación de un UIWebBrowserView Categoría para la captura de la copia:, pegar:, definir: los selectores.

    http://ios-blog.co.uk/iphone-development-tutorials/rich-text-editing-highlighting-and-uimenucontroller-part-3/

    @implementation UIWebBrowserView (UIWebBrowserView_Additions)
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
        return NO;
    }
    @end

    Nota sólo FTR: Hay un pequeño error de escritura en que excelente página web. Aquí está precisamente la forma de hacerlo. Apple 100% rechazar esto. Hacer una categoría

    ¿Cómo se puede REALMENTE eliminar Copia de UIMenuController

    (Usted tiene que escribir «UIWebBrowserView» desde Xcode no traer clases privadas.) Texto completo de la .h and .m archivos:

    //.h file...
    #import "UIWebBrowserView+Tricky.h"
    @interface UIWebBrowserView : UIView
    @end
    @interface UIWebBrowserView(Tricky)
    @end
    
    //.m file...
    #import "UIWebBrowserView+Tricky.h"
    @implementation UIWebBrowserView (Tricky)
    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
    NSLog(@"don't let Apple see this");
    return NO;
    }
    @end

    Para el registro, «un solo clic» todavía aparezca el molesto corrector ortográfico sugerencias! Pero de lo contrario no quitar la doble clic en-contexto-menú totalmente, es 100% rechazada por Apple.

    • lamentablemente esto parece ser un método privado y no pasa la validación
    • Con algunos de articulación, es posible llegar a la UIWebBrowserView sin realmente hacer nada que es un no-no para la AppStore. Objetivo C es un lenguaje dinámico. Sugerencia: dinámica de creación de subclases y isa swizzling.
    • Usted no debería tener!
  5. 1

    Lo siento por mi inglés.
    Pero hay una idea.

    Creo que el método canPerformAction fueron llamados para muchas veces, pero usted acaba de tratar con él de una vez.
    En este caso ,creo que puede haber otro Control de interfaz de usuario la ha llamado. Por ejemplo, el UITextView de control en su UIWebView.

    Supongo que puede generar la interfaz de usuario de guión gráfico. No todos los controles en el guión tiene su propia clase. Puede definir una clase para el control de la respuesta y la reescritura de su canPerformAction método.

    • Estás en lo correcto, canPerformAction es llamado por UIWebBrowserView, una subvista de UIWebView que devuelve SÍ para copiar. Por lo tanto no está llamando a la canPerformAction que fue escrito por nosotros.
  6. 0

    Puedes dibujar tu propio menú en lugar de utilizar UIMenuController. De esa manera, usted puede tener tantos elementos como desee que aparezca en el mismo tiempo sin necesidad de utilizar Otros.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea