UITextField成为第一响应者后,UITableView不会将单元格滚动到可见

时间:2013-06-21 09:40:42

标签: ios uitableview

我有一个UITableView加载了自定义单元格。这些单元有两种可能的状态:只读状态和版本状态。我通过点击表格视图中的相应行来在它们之间进行更改:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomClass *aCustomClass = [self.model objectAtIndex:indexPath.row];
    [aCustomClass setEdition:YES];

    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

问题是我需要在点击行后将单元格的UITextField设置为第一响应者。我所做的是添加以下代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    if (!cell)
        cell = ... // Create cell

    ...

    [cell.textField becomeFirstResponder];
}

一切正常,但当UITextField成为第一响应者时,我希望表视图将整个单元格滚动到可见状态。为此,我实现了这样的键盘通知事件:

- (void)keyboardWillBeShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGRect kbRawRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect ownFrame = [self.tableView.window convertRect:self.tableView.frame fromView:self.tableView.superview];

    // Calculate the area that is covered by the keyboard
    CGRect coveredFrame = CGRectIntersection(ownFrame, kbRawRect);

    coveredFrame = [self.tableView.window convertRect:coveredFrame toView:self.tableView.superview];

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;

    [self.tableView scrollToRowAtIndexPath:self.openCellIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

问题是,表视图不会将单元格滚动到顶部位置,如最后一行所示。

如果我删除了自动becomeFirstResponder来电,并手动点按UITextField,则一切正常。

你知道为什么会这样吗?我怎么能解决这个问题?

谢谢,

1 个答案:

答案 0 :(得分:0)

UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0);

应该像这样改变:

UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, -coveredFrame.size.height, 0.0);