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

textFieldDidEndEditing not called in a tableview inside a navigation controller

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

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

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

我读过很多类似的帖子,我认为问题在于 "event" 被 prepareForSegue 而不是 textFieldDidEndEditing 捕获。如果这是正确的,我不知道如何处理这个问题,因为我不知道在点击完成时如何识别“最后编辑的文本字段”的索引路径。

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

1) textField.convertPoint + tableView.indexPathForRowAtPoint

2) tableView.indexPathForCell + textField.superview

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

非常感谢您的帮助!!!

PS:如果可能的话,请在Swift代码中!

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

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

您可以通过以下方式解决此问题:

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

self.inputField = iCell.inputField;

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

[self.inputField endEditing:YES];

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