3

我有一个 UITableView,每个单元格内都有一个 UITextField。一个模型对象,存储当前正在编辑的单元格的索引。如果单元格滚动到屏幕外,我的应用程序将取消第一响应者状态。(不这样做可能会导致问题)。现在,假设对应于该索引的一个单元格(可能是相同的,也可能是不同的)即将滚动回到屏幕上。我想让该单元格的 textField 成为 firstResponder。我的代表确实接到了电话

tableView: willDisplayCell: forRowAtIndexPath:

对应于新的单元格。但是,此时调用 becomeFirstResponder: 并没有帮助,因为单元格在显示之前不会接受 firstResponder 状态。

没有使用计时器,关于如何调用 becomeFirstResponder 的任何想法:在细胞实际上能够成为第一响应者的时候?

编辑:cellForRowAtIndexPath: 总是在 willDisplayCell: 之前调用。所以那里没有帮助。

4

3 回答 3

1

我还没有尝试过,但我要尝试的第一件事是在 cellForRowAtIndexPath ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // standard stuff to build cell and setup it's state

    if ([indexPath isEqual:self.myModel.indexPathOfTextFieldBeingEdited]) {
        // you probably have a handle to the text field from the setup above
        UITextField *textField = (UITextField *)[cell viewWithTag:SOME_TAG];
        [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
    }
    return cell;
}
于 2013-03-03T19:04:45.310 回答
0

这是我在 MonoTouch 中所做的 - 重要的是不要为 ScrollToRow() 设置动画 - 即“动画:否”,如 edzio27 的答案所示(感谢 edzio27 :))。

var newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);
if (newCell == null)
{
    tableView.ScrollToRow(newIndexPath, UITableViewScrollPosition.Middle, false);
    newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);
}
于 2013-04-20T20:55:16.543 回答
0

您必须在屏幕上显示单元格才能使其成为第一响应者。首先做:

[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];

然后在它的标签/文本字段上调用第一响应者。

于 2013-03-03T19:24:15.880 回答