2008-12-17 13 views
24

En mi aplicación tengo un UITextField dentro de un UITableViewCell. Si hago clic dentro del campo de texto y agrego algo de texto, encuentro que si intenta mover el punto de inserción, funciona la primera vez pero falla en intentos posteriores. Soy completamente incapaz de mover la selección; no aparece una "lupa".La edición de un UITextField dentro de una UITableViewCell falla

Aún más curioso, este "ajuste" parece ser permanente hasta que reinicie la aplicación. Y afecta a todos UITextFields en esa pantalla y no solo a la que originalmente intenté editar.

Si quieres verlo tú mismo, prueba el ejemplo "UICatalog" que viene con el iPhone SDK. Haga clic en "campos de texto" y luego "editar" y juegue con los cuadros de texto.

He investigado mucho sobre esto, pero es bastante difícil buscarlo en Google. Las mejores referencias que he encontrado están en Apple's support board y MacRumors formum (ambas hacen referencia a una solución que aparentemente solía funcionar en iPhone 2.0 pero que no funciona con versiones contemporáneas, lo intenté).

Mi sensación es que esto es un error en el sistema operativo, pero pensé que lo lanzaría al público SO para una segunda opinión y para ver si hay alguna solución. ¿Algunas ideas?

Siguiendo la sugerencia de benzado, intenté crear mi aplicación utilizando los SDK 2.0, 2.1 y 2.2. Obtuve el mismo comportamiento en todas las versiones. (En realidad, algo relacionado pero no es lo mismo entró en 2.2, pero esa es probablemente otra pregunta)

Respuesta

12

Pasé mucho tiempo en esto, pero finalmente creo que lo tengo clavado.

El truco es que la tabla debe ser editable (es decir, su propiedad editing debe establecerse en YES). La buena noticia es que ahora puede mover el punto de inserción. A veces, la lupa no aparece o no te sigue, pero tu gesto siempre parece funcionar.

¿Esto todavía califica como un error? Quizás. Por lo menos, la documentación del SDK de Apple debe actualizarse. He presentado un informe de error con Apple para cubrir esto (rdar: // 6462725).

+0

Guau, acabo de notar el mismo problema en mi aplicación. Probé tu truco y ahora funciona bien, ¡gracias! Además, tuve que hacer tableView: canEditRowAtIndexPath: y tableView: canMoveRowAtIndexPath: devolver NO, para que la tabla no parezca estar en modo de edición. – squelart

+0

Gracias a ambos por esta solución –

+0

UITableView no tiene una propiedad editable, solo UITextField sí ... ¿estás hablando de la propiedad/editing/property en UITableView? o está en UITableViewCell? –

0

Suena como un error del sistema operativo. Intentaré reproducirlo ejecutando el ejemplo de UICatalog contra los SDK 2.0, 2.1 y 2.2 para ver si algo cambia. (Hay un error relacionado con la alineación del texto de la celda de la tabla que ocurre si compila para 2.2, pero no si compila para 2.1, independientemente de la versión del sistema operativo en el dispositivo).

Si resulta ser una diferencia , https://bugreport.apple.com/

+0

Gracias por las sugerencias. Definitivamente intentaré construir con diferentes versiones del SDK. Había asumido que era la versión del sistema operativo en la que se estaba ejecutando el código, pero por supuesto cuando supongo ... –

0

Intenté esto con mi aplicación y parece funcionar como se esperaba. Tengo una lupa todo el tiempo. Estoy usando el 2.1 SDK.

+0

Interesante. Entonces, ¿cómo difiere su uso de UITableView, UITableViewCell y UITextField de eso en el ejemplo de UICatalog? –

2

Gracias a esta publicación, he podido lograr que esto funcione correctamente en mi aplicación.

algo que añadir, sin embargo:

Si configura su mesa para ser editables, es probable que obtener un comportamiento diferente de lo esperado (sangría, la edición de widgets, hay indicadores de divulgación, etc.).Esto me sorprendió pero aquí es cómo tratar mejor con ella:

En su delegado UITableView, poner en práctica:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

A continuación, en la implementación de tu UITableViewCell, pon tu UITableView ser editable SOLAMENTE cuando en realidad estás editando :

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    ((UITableView *)[self superview]).editing = YES; 
... 
} 

y edición desactivar cuando se realiza la edición:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
... 
    ((UITableView *)[self superview]).editing = YES; 
} 

Esto asegurará que su mesa no se encuentre en el modo de edición cuando no esté editando la celda, para que todo funcione sin problemas.

Gracias!

Brian M. Criscuolo Mark/Space Inc.

2

La respuesta de Brian M. Criscuolo es el más cercano, sin embargo su todavía no está muy bien - en mi uso de SDK2.2.1 me parece que tengo que hacer lo siguiente:

Para su UITableViewDelegate (que a menudo es su UITableViewController) añadir las dos características siguientes:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

y:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleNone; 
} 

y:

- (void)viewDidLoad { 
[super viewDidLoad]; 

    // do any other customisation here 
self.uiTableView.editing = true; 
} 

Si usted no pone los dos métodos principales de delegado, lo anterior hará que los iconos de borrado junto a cada fila, y la sangría de cada fila.

No debería necesitar hacer nada con los delegados de campo de texto como Brian indicó (a menos que tenga varias filas y desee responder a un evento didSelectRowAtIndexPath: event - que no parece obtener mientras está en modo edición - entonces deberá hacer también lo que él sugiera).

Por cierto - esto parece fijo en SDK3.0 (aunque sujeto a cambio, supongo)

0

realidad lo que funciona mejor parece ser la de poner la mesa "editar" propiedad en true en "viewDidLoad" y añadiendo éstos al delegado mesa

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

que no tienen que hacer nada en el campo de texto delegado

Cuestiones relacionadas