2010-11-25 6 views
7

Mi UIView contiene dos UITextField. Necesito restringir la opción de copiar y pegar para un campo de texto. No deseo restringirlo para otro.Copia de restricción, opción de pegado para un UITextfield particular

Cuando estoy usando el siguiente código, tanto el campo se restringe de copiar, pegar.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if ([UIMenuController sharedMenuController]) 
    { 
      [UIMenuController sharedMenuController].menuVisible = NO; 
    } 
    return NO; 
} 

¿Puede alguien darme la solución para resolver mi problema.

+0

¿Ha intentado establecer 'userInteractionEnabled' en' NO'? ¿O debería UITextView seguir siendo editable? –

+0

@afEken Creo que debería ser editable – KingofBliss

Respuesta

19

Crea una subclase de UITextField. En esta subclase, implemento

 
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (sel_isEqual(action, @selector(copy:))) { 
     return NO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

después utilizar esta subclase para el campo que no desea ser capaz de copiar, y utilizan un UITextField regular para la que se puede copiar.

+0

Está bien ... Pero no quiero mostrar ningún Menú (Cortar, Copiar, pegar, seleccionar, etc.) para el UITextfield restringido. –

+0

Puedes probar tu cosa '[UIMenuController sharedMenuController] .menuVisible' dentro de' -canPerformAction: 'en ese caso. Siempre y cuando solo lo hagas desde dentro de tu subclase, debería comportarse como se espera. –

+2

¿Podría siempre devolver NO para deshabilitar todas las acciones? – kevboh

2

explanantion de Apple:

Esta implementación por defecto de este método devuelve SÍ si la clase de respuesta implementa la acción solicitada y llama al siguiente respondedor si no lo hace. Las subclases pueden anular este método para habilitar comandos de menú basados ​​en en el estado actual; por ejemplo, se permitiría el comando Copiar si hay es una selección o desactivar el comando Pegar si la mesa de trabajo no hizo contienen datos con la correcta cartón tipo de representación.

Por lo tanto, la solución es subclase de UITextView y devolver correctamente.

More information about the method here

4

El siguiente impide cualquier cadena de más de 1 carácter a pegar. Sin embargo, la cadena que tenga 1 carácter de largo pasará (podría ser útil para algunas personas, no necesita subclases).

En primer lugar darle a su textField un delegado

myTextField.delegate = self; // OR [myTextField setDelegate:self];

A continuación, agregue el siguiente método para su ViewController

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    if ([string length] > 1) { 
     return NO; 
    } 
    return YES; 
}
+0

@cbdhac: Gracias por su respuesta. Pero la cuestión es que no quiero pegar solo un char también. –

+0

Este código no evitará cadenas con más de 1 carácter en ejecución, evitará cadenas con más de 1 byte pasando ... por lo tanto, esto evitará que el usuario escriba caracteres Unicode con más de 1 byte (como EMOJI) caracteres). –

+0

¡Exactamente lo que necesitaba! – Theodoros80

1

tenía una idea al azar que funcionó a la perfección en una vista de texto. No hay razón por la cual no funcionaría en un campo de texto.

Agregué lo siguiente al campo de texto que quería restringir.

  • prensa larga Gesto el reconocedor (1 toque)
  • reconocedor de prensa larga Gesto (2 toques)
  • Tap Gesto Reconocedor (2 grifos, 1 toque)
  • Tap Gesto Reconocedor (3 grifos, 1 toque)
  • Reconocedor Tap Gesture (1 grifo, 2 toques)

Entonces asignado el código siguiente a la misma.

- (IBAction)cancelTouch:(id)sender { 
    //do nothing 
} 

puedo ahora todavía desplazarse por la TextView sino una pulsación larga o doble toque ahora hacer absolutamente nada!

Cuestiones relacionadas