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 字段的用户输入更改 UIView 框架的高度和宽度
如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?