导航控制器内的表格视图中未调用 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 方法