UITableViewCell 中的 UITextField - 当它出现在屏幕上时,以编程方式使其成为 firstResponder?

Posted

技术标签:

【中文标题】UITableViewCell 中的 UITextField - 当它出现在屏幕上时,以编程方式使其成为 firstResponder?【英文标题】:UITextField within UITableViewCell -- programmatically make it firstResponder when it comes on screen? 【发布时间】:2013-03-03 18:53:31 【问题描述】:

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

tableView: willDisplayCell: forRowAtIndexPath:

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

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

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

【问题讨论】:

任何时候出现单元格时都会调用-cellForRowAtIndexPath 委托方法,所以,您是否尝试将 uitextfield 设置为那里的第一响应者? 【参考方案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;

【讨论】:

试过了。不好。问题还是单元格没有显示。 你使用 performSelector 了吗?它肯定在 cellForRowAtIndexPath 返回并且主循环返回后显示。 这实际上是一个计时器。像这样的延迟通常会起作用。但这不是理想的编程风格,可能会被 Apple 更新破坏。 延迟为 0.0,这只是表示在当前运行循环返回后将此消息排队以尽快运行。不确定我是否理解您关于编程风格的观点,或者为什么这 - 与 sdk 行为的任何其他部分相反 - 会更容易受到苹果的改变。 ...但我当然接受你的不接受:)。 对,如果事情发生了变化,以至于运行循环的下一次迭代不再足够好怎么办?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

var newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);
if (newCell == null)

    tableView.ScrollToRow(newIndexPath, UITableViewScrollPosition.Middle, false);
    newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);

【讨论】:

以上是关于UITableViewCell 中的 UITextField - 当它出现在屏幕上时,以编程方式使其成为 firstResponder?的主要内容,如果未能解决你的问题,请参考以下文章

根据内容大小属性设置 UIText 视图的宽度

从 UIText 字段的用户输入更改 UIView 框架的高度和宽度

无法更改 UIText 视图的字体(使用 Web 服务时)

如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?

UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签

更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象