textFieldDidEndEditing 触发“为时已晚”

Posted

技术标签:

【中文标题】textFieldDidEndEditing 触发“为时已晚”【英文标题】:textFieldDidEndEditing firing "too late" 【发布时间】:2012-02-17 02:14:03 【问题描述】:

我有一个用户正在输入数据的多视图过程,并且我将其保存到模型类属性中的每一步。

我使用textFieldDidEndEditing检查输入是否有效,如果有效,则保存输入的数据。

在视图上,我有一个 continueButtonClicked 事件,它检查是否所有验证都通过了,如果是,则加载下一个视图。我没有在这里设置模型的属性,因为我认为我不应该这样做,因为每个字段一次都保存到模型 1 字段中。但是,我注意到了一些问题。

如果用户在文本框内并单击“继续”按钮,则 continueButtonClicked 事件在 textFieldDidEndEditing 之前触发。最终发生的情况是,在 textFieldDidEndEditing 中进行保存之前,下一个视图填充了“旧”模型。

我错过了什么?在 Continue 上设置所有属性是否合适?如果我为 Web 编程,我会这样做,但对于原生应用程序来说似乎不合适。

【问题讨论】:

【参考方案1】:

您可以在活动文本字段/文本视图(或所有这些)上调用resignFirstResponder,这将触发textFieldDidEndEditing

一般来说,对于此类文本编辑问题,另一种方法是滥用-textField:shouldChangeCharactersInRange:... 委托方法,您可以在其中确定输入的每个字符的新值。只有在没有其他方法的情况下,您才应该恢复使用此方法。

【讨论】:

谢谢。当我有时间时,我也会研究这种方法 - 只是为了绕开它。 mbh上面的解决方案碰巧让我尝试更快,但我也对这个很好奇【参考方案2】:

你可以试试这个,看看是否能解决你的问题?

textFieldShouldEndEditing:

【讨论】:

太棒了!这似乎解决了这个问题。我对为什么 textFieldShouldEndEditing 会触发两次感到有些困惑:一次是在所有字段的 continueButtonClick 之前,第二次是在 continueButtonClick 事件触发之后的活动字段。它似乎无害,但只是好奇。 如果它是你真正想要的活跃的,你总是可以通过测试那是否是第一响应者来确定。

以上是关于textFieldDidEndEditing 触发“为时已晚”的主要内容,如果未能解决你的问题,请参考以下文章

textFieldDidEndEditing 替代

textFieldDidEndEditing 未在 swift 中调用

在文本字段中插入一个字符后启用完成按钮: textFieldDidEndEditing: 或 textFieldShouldBeginEditing: 或?

当调用 textFieldDidEndEditing 时,应用程序冻结

如何将文本字段更改通知合并到 textFieldDidEndEditing

textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用