2010-02-22 9 views
6

Tengo un campo de texto dentro de tableViewCell. Recientemente me di cuenta de que si ingreso un valor en el cuadro de texto y luego desplazo la celda fuera de la pantalla, el valor en el cuadro de texto desaparece.iPhone - textField en tableViewCell - Desplazar pantalla apaga el valor

Tengo una protección contra esto. Si no hay un UIKeyboard presente, el tableView no puede desplazarse lo suficiente para tener que volver a dibujar la celda. Sin embargo, algunos usuarios no usan la tecla "done" en el teclado para hacer que el teclado desaparezca, y en cambio desplazan la tabla hacia arriba, rompiendo el programa.

¿Hay alguna forma de almacenar inmediatamente la cadena textField en una variable, o evitar que la vista de tabla se desplace, o hacer que el teclado desaparezca si el usuario intenta desplazar la vista de tabla?

No tengo un archivo NIB para esta vista, es un tableViewController programático, por lo que no puedo hacer nada en Interface Builder con botones personalizados invisibles, como se sugiere en otras preguntas en StackOverflow.

Respuesta

5

¿Estás instanciando el campo de texto dentro de tu método cellForRowAtIndexPath ::? Si es así, puede volver a crear instancias cada vez que la celda se desplaza a la vista.

Debe guardar una referencia al campo de texto en el controlador y volver a utilizarlo en su cellForRowAtIndexPath ::

+0

Uso un bloque de instrucción case para agregar textField a la sección 0, fila 2. El textField se declara en el encabezado como un puntero, por lo que puedo acceder a las propiedades mediante myTextField.text. ¿Esto ayuda? – Justin

+0

No estoy del todo siguiendo. ¿Está diciendo en su método cellForRowAtIndexPath que tiene una declaración de caso que determina si se encuentra en la Sección 0, Fila 2 y, de ser así, agrega el campo de texto? En caso afirmativo, ¿a dónde se llama [[UITextField alloc] init]? Si también está dentro del método cellForRowAtIndexPath, entonces probablemente esté reinicializando el campo de texto cada vez que la fila se desplaza a la vista (y se llama a cellForRowAtIndexPath). Intente inicializar su campo de texto en loadView o el método init principal de su controlador. – chrissr

0

La respuesta a esta pregunta es implementar el método ScrollView delegado willBeginDragging. UITableView hereda de UIScrollView.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; 
     [textField resignFirstResponder]; 
} 

Esto descarta el teclado tan pronto como el tableView comienza el desplazamiento

Por esta herencia, también es posible mantener el tableView de desplazamiento, y punto. Establecer la propiedad scrollEnabled en NO, a la

self.tableView.scrollEnabled = NO; 
0

Usted debe estar fijándose el delegado de la NSTextField que ha creado para el controlador y luego implementar textField:shouldChangeCharactersInRange:replacementString: en su controlador para que se le notifique en cualquier momento los cambios en el texto en el campo de texto .

Cuando el texto cambie, almacene el texto modificado en una propiedad de su controlador.

Cuando crea NSTextField en cellForRowAtIndexPath, establezca el valor de esa propiedad.

Recuerde que con Cocoa necesita mantener los datos de su modelo separados de su vista.

+0

Pero, ¿qué sucede cuando textField se desplaza hacia arriba y se borra el valor? ¿La variable de instancia también pierde su valor? – Justin

+0

No, cuando un delegado llama a textField: shouldChangeCharactersInRange: replacementString debe copiar la cadena del campo de texto en una propiedad de instancia para que sea válida después de que se elimine la UITableViewCell. –

Cuestiones relacionadas