No encontré ninguna solución que me funcione en la web. Después de días de buscar en Google y experimentar, finalmente tengo este publicado bien clavado. Es un error complejo en Apple iPhone como verá al final de esta publicación.
Si ejecutó en un tema como yo de la siguiente manera:
tener tableviewcell mayor que la mitad de la pantalla del iPhone (No confundir con ejemplos de UICatalog de Apple tienen una corta tableview de células de menos de 50 puntos, aquí no aplicable.),
tienen más de un uitexfields en la célula o combinación de UITextField y UITextView o UIWebView en la célula,
Tapping entre uitextfields y UITextView o uiweb ver resultados en una posición de desplazamiento impredecible, el uitextfield cliqueado salta de la vista o queda cubierto por el teclado. Solo funciona la primera vez cuando el teclado aparece en la mesa de visión y no funciona bien posteriormente.
tuve la gran ruptura a través de mensajes después de leer similares a éste: http://alanduncan.net/old/index.php?q=node/13 No consiguieron completamente correcto tampoco. El dolor es causado por un error en los eventos de UIKeyboard. Cuando aparece el teclado por primera vez, emite un UIKeyboardWillShowNotification y UIKeybaordDidShowNotification. Theree es un error en iPhone que de alguna manera el primer UIKeyboardWillShowNotification difiere del UIKeyboardWillShowNotification posterior. La solución es OBSERVAR UIKeyboardDidShowNotification. Por eso, cuando aparecerá su celular, añada el siguiente código
NSNotificationCenter*nc=[NSNotificationCenter defaultCenter];
[nc addObserver:self selectorselector(keyboardDidShow name:UIKeyboardDidShowNotification object:self.window];
En la función keyboardDidShow, tenemos que desplazar la tableView, no el tableviewcell como se sugiere en el post anterior. O puede ver varios objetos que se separan, no se desplazan juntos en una sola pieza.
(void)keyboardDidShow:(NSNotification *)notif
{
//1. see which field is calling the keyboard
CGRect frame;
if([textField_no1 isFirstResponder])
frame=textField_no1.frame;
else if([textField_no2 isFirstResponder])
frame=textField_no2.frame;
else if([textField_no3 isFirstResponder])
frame=textField_no3.frame;
else if([textView isFirstResponder])
frame=textView.frame;
else return;
CGRect rect=self.superview.frame;
//2. figure out how many pixles to scroll up or down to the posistion set by theKeyBoardShowUpHorizon.
//remove the complexity when the tableview has an offset
[((UITableView*)[self.superview).setContentOffset:CGPointMake(0,0) animated:YES];
int pixelsToMove=rect.origin.y+ frame.origin.y-theKeyBoardShowUpHorizon;
//3. move the uitableview, not uitableviewcell
[self moveViewUpOrDownByPixels:pixelsToMove];
}
- (void)moveViewUpOrDownByPixels:(int)pixels
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.6];
//find the position of the UITableView, the superView of this tableview cell.
CGRect rect=self.superview.frame;
//moves tableview up (when pixels >0) or down (when pixels <0)
rect.origin.y -= pixels;
rect.size.height += pixels;
self.superview.frame = rect;
[UIView commitAnimations];
}
para restaurar el tableView atrás, es necesario agregar observador UIKeyboardDidHideNotification (no UIKeyboardWillHideNotification según lo sugerido por otros puestos, para evitar el parpadeo) donde tableviewcell aparece cada vez y volver a poner la tableview a donde estaba.
[nc addObserver:self selectorselector(keyboarDidHide) name:UIKeyboardDidHideNotification object:nil];
- (void)keyboardDidHideNSNotification*)notif
{
//we have moved the tableview by number of pixels reflected in (self.superview.frame.origin.y). We need to move it back
[self moveViewUpOrDownByPixels:self.superview.frame.origin.y];
}
No se olvide de eliminar tanto de la observesr cuando su celular desaparecer por [[NSNotificationCenter defaultCenter] removeObserver: ...
Eso es todo lo que necesita. Espero que un día el equipo de Apple iPhone resuelva este problema, tal vez en 4.0 en unos pocos meses.
Agosto, eso es lo que estoy haciendo actualmente. El problema con eso es que el desplazamiento debe suceder en dos lugares. En el método tableView: didSelectRowAtIndexPath: y en el método textFieldDidBeginEditing :. Al hacer clic directamente en el UITextField, no aparece, por lo que no se puede manejar en un solo lugar. – Coocoo4Cocoa
Debería tener los métodos UITextFieldDelegate llamando al tableView: didSelectRowAtIndexPath: si el desplazamiento en ambos casos es el mismo. Esta es la única forma razonable de hacerlo, ya que UITableTexField oculta el UITableView. –