意外行为文本textFieldShouldBeginEditing / textFieldDidBeginEditing

时间:2018-11-15 19:26:28

标签: ios swift uitableview swift3 uitextfield

我在静态单元格tableView上有一个名为UItextField的{​​{1}}。该字段包含货币金额-例如“ $ 10,000.00”。

编辑该金额时,货币和千位分组符号有点麻烦。因此,我想在该字段成为第一响应者时将其删除。

我在textField中这样做。

我第一次这样做,一切正常。 textFieldShouldBeginEditing的内容重新格式化,没有货币和千位分隔符。

textField,我再次将值重新格式化为正确的货币字符串。这也可以。

当我第二次重新输入该字段时,会发生问题。调试时,我可以看到textFieldDidEndEditing已更改为没有货币符号和分组符号的字符串,但显示的内容并未显示。虽然它确实是第一次工作!第二次看起来好像屏幕上的内容和调试器看到的值之间不匹配。

我尝试过类似的事情:

  • tableView.beginUpdates(); tableView.endUpdates()
  • textView.setNeedsDisplay

...但这不起作用。

因此,我将删除textField.text中的货币格式的代码复制到了新的委托方法textFieldShouldBeginEditing中。

然后一切正常。我可以点击其他控件多次并返回到textField,每次控件输入时都会失去其格式,并且失去焦点后将恢复为格式化的货币字符串。

因此,我决定删除方法textFieldDidBeginEditing。但是后来事情又崩溃了!看来我必须同时实现textFieldShouldBeginEditingtextFieldShouldBeginEditing才能准备textFieldDidBeginEditing的内容供用户编辑?

这是一个错误吗?

textField

1 个答案:

答案 0 :(得分:1)

您应该尝试textField的文本更改事件,在下面附加代码:

在textField上添加目标以更改文本:

self.textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

textField的文本更改功能:

func textFieldDidChange(_ textField: UITextField)
{
    if textField === self.textField
    {
         //try formatting here
    }
}