点击下一个UITextField时没有UIKeyboardWillShowNotification

时间:2011-09-17 07:28:17

标签: iphone objective-c

我有几个UITextField列在彼此之下,并希望在键盘向上滑动时适当移动活动字段。

我已将我的控制器作为观察者添加到UIKeyboardWillShowNotifications中,并且在用户首次点击文本字段时工作正常。如果他在没有让键盘消失的情况下点击其他一个文本字段,则首先不会出现UIKeyboardWillShowNotifications,我没有机会调整新活动文本字段的位置。我想在某种程度上没有UIKeyboardWillShowNotification出现,因为键盘只是停留在那里但是......

怎么做??

我不知道如何在其他地方添加我的调整代码,因为我需要在键盘通知中保存在userInfo中的键盘大小信息。

非常感谢,
斯坦

编辑:如果我在这里粘贴一些代码,可能会更清楚我需要什么:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellInputViewWillOpen:) name:UIKeyboardWillShowNotification object:nil];    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellInputViewWillClose) name:UIKeyboardWillHideNotification object:nil];  
}

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void) cellInputViewWillOpen:(NSNotification *)aNotification {
    CGRect keyboardFrame = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
    keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]];
    self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, cell.frame.origin.y - ((self.tableView.frame.size.height - keyboardFrame.size.height) / 2.0f)); 
    self.tableView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, keyboardFrame.size.height - 44.0f, 0.0f);
    [UIView commitAnimations];
}

- (void) cellInputViewWillClose {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    self.tableView.contentInset = UIEdgeInsetsZero;
    [UIView commitAnimations];     
}

1 个答案:

答案 0 :(得分:1)

请改用textField:didBeginEditing。如果您的键盘已经显示,您可能需要单独跟踪,这样您就不会滚动两次。

编辑:对不起,我没有意识到你在谈论桌面视图。在这种情况下,您可以像现在一样调整滚动视图内容,然后在使用表视图委托方法更改选择时使用表视图滚动来索引路径方法。