2011-09-03 72 views
6

这里是问题,当我调试我的程序时,我发现keyboardWillShow函数没有响应每次。只是第一次,它会被程序调用。这里是我的代码,我不知道我的代码有什么问题,但是,当键盘第一次出现时,该函数运行良好。keyboardWillShow not responding

- (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]; 
} 

,我记数通知

- (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]; 

} 

,并在这里

- (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]; 


} 

我辞职firstresponder删除它,这里是我的代码

- (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

你需要更多的信息,你释放急救员?第二次发生什么事等 –

+0

是的,我辞职FirstResponder,这里是我的代码 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action :@selector(save :)] autorelease]; [self setUpUndoManager]; [textField resignFirstResponder]; return YES; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { [self save]; [textField resignFirstResponder]; 返回YES; }' – leoyfm

+0

当第二次键盘显示时,keyboardWillShow方法不会自动调用。换句话说,keyboardWillShow方法只是在第一次运行键盘时弹出。之后,此方法再也不会运行。 – leoyfm

回答

5

请确保您有不写任何代码来删除ob服务器..... 请提供keyboardWillHide方法也....

+0

我在viewDidUnload方法中删除观察者。事实上,即使我不删除它,问题仍然存在。 – leoyfm

+0

在viewDidUnload中移除观察者很酷....我不明白一件事...为什么你写了[textField resignFirstResponder]; 在textFieldShouldBeginEditing ...提供更多关于它..... – Mohammad

+0

它可能有点奇怪。当用户点击文本框时,我只想让键盘消失。但我知道键盘出现和消失动作之间存在冲突。我从我的代码中删除这个方法。但问题仍然存在。我不是第一次为什么,每件事情都很好。 textfield滚动是完美的。但之后,textfield不滚动。我发现通过调试,keyboardwillshow方法在第一次后永远不会运行。用于调整我在keyboardwillshow方法中编写的textfield框架的代码。这样为什么textfield不能在第一次后滚动。 – leoyfm