导航控制器内的表格视图中未调用 textFieldDidEndEditing

Posted

技术标签:

【中文标题】导航控制器内的表格视图中未调用 textFieldDidEndEditing【英文标题】:textFieldDidEndEditing not called in a tableview inside a navigation controller 【发布时间】:2015-10-21 11:34:32 【问题描述】:

我在导航控制器中有一个 tableview 控制器。此表仅在每一行中显示一个文本字段。在我的导航控制器中,我有一个“完成”导航项,它获取在文本字段中输入的所有值并显示下一个屏幕。

tableview 控制器实现 UITextFieldDelegte 和 textFieldDidEndEditing 以将每个文本字段的值存储在其数据源(字符串数组)中。在 cellForRowAtIndexPath 中,我还将文本字段的委托分配给自己。如果我点击不同的文本字段,这一切都很好,我会看到数据源是如何正确更新的。

我的问题是当我执行此序列时:在一个文本字段中输入一个值,然后点击“完成”导航项。我看到未调用 textFieldDidEndEditing ,因此未存储该值。我也尝试了 textFieldShouldReturn 和 textFieldShouldReturn 但没有。

我已经阅读了许多类似的帖子,我认为问题在于“事件”被 prepareForSegue 而不是 textFieldDidEndEditing 捕获。如果这是正确的,我不知道如何处理这个问题,因为我不知道如何在点击 Done 时识别“最后编辑的文本字段”的 indexPath。

另一个相关问题:当​​调用 textFieldDidEndEditing 时,我已经看到了两种方法来获取包含文本字段的单元格的 indexPath:

1) textField.convertPoint + tableView.indexPathForRowAtPoint

2) tableView.indexPathForCell + textField.superview

两者似乎都运行良好,没有差异(我刚才提到的问题除外)。有什么方法比另一种更好吗?

非常感谢您的帮助!!!

PS:如果可能,请使用 Swift 代码!

【问题讨论】:

【参考方案1】:

点击完成按钮后,您可以添加此行, [self.view endEditing:YES]; 此行将退出您当前活动的文本字段,并将调用您的文本字段代表。

如果您在这种情况下显示同一表格部分中的所有文本字段,您可以将 indexPath.row 分配给 textField.tag,并使用该标签创建 indexPath。

【讨论】:

就是这样!非常感谢!我知道你对标签的想法。好的!最推荐这三种方法中的任何一种吗?再次感谢! 根据代码中的复杂性,您可以使用不同的方法。正如我所说,如果您在这种情况下在单个部分中显示所有文本字段,我的解决方案很简单,但如果您在这种情况下实现多个部分,则必须使用 textField.convertPoint + tableView.indexPathForRowAtPoint 是的,它们在一个部分中。顺便说一句,为了记录,我刚刚看到 tableView.indexPathForCell 因为不可见的单元格而不能很好地工作,所以我不建议使用它。【参考方案2】:

你可以这样解决这个问题:

第 1 步:跟踪您的活动文本字段。您可以保持对它的强引用,并在激活 textField 时设置它。像这样的:

self.inputField = iCell.inputField;

第 2 步:点击完成按钮后,在动作处理程序中添加以下行。

[self.inputField endEditing:YES];

PS:或者,您可以直接调用[self.view endEditing:YES];,而无需跟踪当前活动的文本字段。我个人会继续参考文本字段,因为它可以帮助我围绕当前活动的文本字段做其他事情。

【讨论】:

也感谢您的回答!我认为这与 Kavya 的方法相同。

以上是关于导航控制器内的表格视图中未调用 textFieldDidEndEditing的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中未调用 UICollectionView DidDeselectItemAtIndexPath 方法

将 TextField 条目从模态视图控制器保存到核心数据单独的实体

如何将参数传递给导航控制器内的弹出视图控制器

从 xib 内的按钮单击调用 IBAction 时出错

导航控制器内的标签栏控制器,或共享导航根视图

导航控制器内的 UITableView 在关闭 presentViewController 后不滚动