2011-09-03 29 views
6

aquí hay un problema, cuando depuro mi programa, encontré que la función keyboardWillShow no responde siempre. solo la primera vez, se llamará por programa. aquí está mi código, no sé cuál está mal en mi código, pero, cuando apareció el teclado por primera vez, la función funciona bien.tecladoWillShow no responde

- (void)keyboardWillShow:(NSNotification *)notification { 

    /* 
    Reduce the size of the text view so that it's not obscured by the keyboard. 
    Animate the resize so that it's in sync with the appearance of the keyboard. 
    */ 


    NSDictionary *userInfo = [notification userInfo]; 

    // Get the origin of the keyboard when it's displayed. 
    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; 

    // Get the top of the keyboard as the y coordinate of its origin in self's view's coordinate system. The bottom of the text view's frame should align with the top of the keyboard's final position. 
    CGRect keyboardRect = [aValue CGRectValue]; 
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; 

    CGFloat keyboardTop = keyboardRect.origin.y; 
    CGRect newTextViewFrame = self.textview.frame; 

    newTextViewFrame.size.height = keyboardTop - self.view.bounds.origin.y; 

    // Get the duration of the animation. 
    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval animationDuration; 
    [animationDurationValue getValue:&animationDuration]; 

    // Animate the resize of the text view's frame in sync with the keyboard's appearance. 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:animationDuration]; 

    textview.frame = newTextViewFrame; 

    [UIView commitAnimations]; 
} 
- (void)keyboardWillHide:(NSNotification *)notification { 

    NSDictionary* userInfo = [notification userInfo]; 

    /* 
    Restore the size of the text view (fill self's view). 
    Animate the resize so that it's in sync with the disappearance of the keyboard. 
    */ 
    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval animationDuration; 
    [animationDurationValue getValue:&animationDuration]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:animationDuration]; 

// textview.frame = self.view.bounds; 
    [self save]; 

    [UIView commitAnimations]; 
} 

y yo notificación regist

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(keyboardWillShow:) 
    name:UIKeyboardWillShowNotification 
    object:nil]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(keyboardWillHide:) 
    name:UIKeyboardWillHideNotification 
    object:nil]; 

} 

y sacarlo aquí

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self save]; 
    self.textview = nil; 
    self.title = nil; 
    self.tags = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 


} 

i resigno firstresponder, aquí es mi código

- (IBAction)save:(id)sender { 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNote)] autorelease]; 

    [textview resignFirstResponder]; 


} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(save:)] autorelease]; 
    [self setUpUndoManager]; 

    return YES; 


} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ 
    [self save]; 
    return YES; 

} 
+1

Necesita más información, ¿libera la primera respuesta? Lo que está sucediendo la segunda vez, etc. –

+0

sí, renuncio FirstResponder, aquí está mi código - (BOOL) textFieldShouldBeginEditing: (UITextField *) textField { self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target: self action : @selector (guardar :)] liberación automática]; [self setUpUndoManager]; [textField resignFirstResponder]; return SÍ; } - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [self save]; [textField resignFirstResponder]; return SÍ; } ' – leoyfm

+0

cuando se muestra el teclado por segunda vez, el método keyboardWillShow no se llama automáticamente. en otras palabras, el método keyboardWillShow se ejecuta por primera vez cuando aparece el teclado emergente. después de eso, este método nunca se ejecutará nuevamente. – leoyfm

Respuesta

5

Asegúrese de que usted está no escribir ningún código para eliminar ob servidor ..... Indique el método keyboardWillHide también ....

+0

quito el observador en el método viewDidUnload. de hecho, aunque no lo elimine, el problema sigue existiendo. – leoyfm

+0

quitando el observador a la vistaDidUnload is cool .... No entiendo una cosa ... por qué has escrito [textField resignFirstResponder]; en textFieldShouldBeginEditing ... proporciona un poco más sobre él ..... – Mohammad

+0

puede ser un poco raro. Solo quiero que el teclado desaparezca cuando el usuario toque el campo de texto. pero sé que hay un conflicto entre la aparición del teclado y la acción de desaparecer. elimino este método de mi código. pero el problema todavía tiene. No sé por qué la primera vez, todo es bueno. el desplazamiento del campo de texto es perfecto. pero después de eso, el campo de texto no se desplaza. Descubrí que a través de la depuración, el método keyboardwillshow nunca se ejecuta después de la primera vez. el código para ajustar el marco del campo de texto que escribo en el método keyboardwillshow. así que por qué el campo de texto no se desplaza después de la primera vez. – leoyfm

Cuestiones relacionadas