2011-10-31 17 views
15

Entiendo que esta pregunta se ha hecho antes, pero no estoy satisfecho con las respuestas, es decir, inhabilitándola. Existe una diferencia fundamental: la vista desactivada no activa eventos, pero para una vista de solo lectura, todavía debe disparar un evento como (por ejemplo, TouchUpInside) y lo necesito. Lo único que no quiero es la entrada del teclado.iPhone/iPad: ¿Cómo hacer que UITextField sea de solo lectura (pero no está deshabilitado)?

La razón es que tengo varios campos de entrada, algunos pueden usar UITextField directamente, otros no. Quiero que se vean similares. Entonces, me gustaría usar UITextField para mostrarlos todos. Algunos de ellos deben ser de solo lectura, de modo que pueda usar el evento de retoque para una entrada alternativa.

¿O podría haber una forma completamente diferente de hacerlo?

EDITAR: Esto es para mi proyecto MonoTouch. Tengo conocimiento muy limitado en object-c.

+0

Es muy fácil asignar un valor de etiqueta común a todos los campos de texto 'no editables' y verificarlo en el método 'textFieldDidBeginEditing' y devolver el BOOL apropiadamente – Gokul

Respuesta

25

Supongamos que tiene 2 variables de instancia de campo de texto conectadas a los campos de texto que creó en el Creador de interfaces. Vamos a llamarlos myReadOnlyTextField y myEditableTextField. Asegúrese de conectar la propiedad delegate de cada campo de texto en Interface Builder al controlador de vista ("Propietario del archivo") [1]. Ahora, en el controlador de vista @implementation (archivo .m), use el método textFieldShouldBeginEditing: y ponga algo de lógica para determinar qué campo de texto desea permitir la edición y cuál no permitir la edición; algo como esto:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    BOOL editable; 
    if (textField == myReadOnlyTextField) { 
     editable = NO; 
    } else if (textField == myEditableTextField) { 
     editable = YES; 
    } else { 
     // editable = YES/NO/Other Logic 
    } 
    return editable; 
} 

Desde el UITextFieldDelegate Documentation:

textFieldShouldBeginEditing:
Pide al delegado si debe comenzar la edición en el campo de texto especificado.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

Parámetros
textField - El campo de texto para el que la edición está a punto de comenzar .

Valor devuelto
YES si una sesión de edición debe ser iniciado; de lo contrario, NO para no permitir la edición.

Discusión
Cuando el usuario realiza una acción que normalmente iniciar una sesión de edición, el campo de texto llama a este método primero en ver si en realidad debería proceder de edición. En la mayoría de los casos, usted simplemente devolverá SÍ desde este método para permitir que la edición continúe.

La implementación de este método por parte del delegado es opcional. Si es no presente, la edición continúa como si este método hubiera devuelto SÍ.

UITextField Documentation es una buena lectura también.


[1] Usted puede hacer esto mediante programación también. Aquí está un ejemplo:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // ..... 
    myReadOnlyTextField.delegate = self; 
    myEditableTextField.delegate = self; 
} 
+0

Muchas gracias por su rápida respuesta. Lamento haber olvidado mencionar en mi pregunta que estoy trabajando en el proyecto MonoTouch. De mi limitado conocimiento de objeto-c, no entiendo lo que estás tratando de hacer aquí. De hecho, estoy buscando una solución simple (como establecer una propiedad) si es posible. Si se necesita tanto código para que funcione, probablemente intentaré encontrar una solución diferente. – newman

+1

¿Una docena de líneas de código es demasiado para ti? Y, por cierto, está estableciendo una propiedad, la de delegar. Y ese delegado decide el tiempo en que puedes editar el campo. – NJones

+8

@miliu, Sin ofender, pero esta es la respuesta correcta. ¿Por qué no dedicar tiempo a implementarlo y quizás aprender algo de objetivo c mientras lo hace? – sosborn

14

A pesar del hecho de que necesita sin teclado, textField:shouldChangeCharactersInRange:replacementString: es muy útil. Impide que se edite el campo de texto, pero aún así se lo puede seleccionar en contraste con textFieldShouldBeginEditing:.

En MonoTouch:

var txt = new UITextField(); 
txt.ShouldChangeCharacters += (field, range, replacementString) => false; 
+2

Esto es útil cuando se reemplaza la vista de entrada (teclado) con una vista personalizada (por ejemplo, un selector de fecha). – andref

1

porque se está trabajando en MonoTouch se puede utilizar la siguiente línea de código:

myReadOnlyButton.ShouldBeginEditing = t => 
{ 
    //event code 
    return false; 
}; 
2

puede tener dos opciones: a) utilizar ShouldBeginEditing con el regreso falso, pero no puede usar PickerView como InputView en su campo de texto. b) utilizar ShouldChangeCharacters que evitará la edición, pero que permitirá el uso de InputView con PickerView.

Cuestiones relacionadas