我在导航控制器中有一个tableview控制器。此表只显示每行中的一个文本字段。在我的导航控制器中,我有一个“完成”导航项,它可以获取在文本字段中输入的所有值,并显示下一个屏幕。
tableview控制器实现UITextFieldDelegte和textFieldDidEndEditing,以将每个文本字段的值存储在其数据源(字符串数组)中。在cellForRowAtIndexPath中,我还将文本字段的委托分配给自己。如果我点击不同的文本字段,这一切都很有效,我看到数据源是如何正确更新的。
我的问题是当我执行此序列时:在一个文本字段中键入一个值,然后点击“完成”导航项。我看到没有调用textFieldDidEndEditing,因此不存储该值。我也尝试过textFieldShouldReturn和textFieldShouldReturn,但没有。
我看过很多类似的帖子,我认为问题在于"事件"正在被prepareForSegue而不是textFieldDidEndEditing捕获。如果这是正确的,我不知道如何处理这个,因为我不知道如何在点击完成时识别“最后编辑的文本字段”的indexPath。
另一个相关问题:当调用textFieldDidEndEditing时,我已经看到两种方法来获取包含文本字段的单元格的indexPath:
1)textField.convertPoint + tableView.indexPathForRowAtPoint
2)tableView.indexPathForCell + textField.superview
两者似乎都没有差异(除了我刚才提到的问题)。任何方法都比另一种更好吗?
非常感谢您的帮助!!!
PS:如果可能,请使用Swift代码!
答案 0 :(得分:5)
点击完成按钮即可添加此行, [self.view endEditing:YES]; 此行将重新签名您当前活动的文本字段,并将调用您的文本字段委托。
如果在这种情况下显示同一表部分中的所有文本字段,则可以将indexPath.row分配给textField.tag,并使用该标记创建indexPath。
答案 1 :(得分:0)
您可以通过以下方式解决此问题:
第1步:跟踪您的有效文字字段。您可以对其进行强有力的引用,并在激活textField时进行设置。像这样:
self.inputField = iCell.inputField;
第2步:点击完成按钮后,在动作处理程序中添加以下行。
[self.inputField endEditing:YES];
PS:或者,您只需拨打[self.view endEditing:YES];
即可,无需跟踪当前有效的文本字段。我个人而言,继续引用textfield,因为它可以帮助我在当前活动文本字段周围做其他事情。