textFieldShouldBeginEditing

textFieldShouldBeginEditing

我在静态单元格tableView上有一个称为UItextFieldtextField。该字段包含货币金额-如“$ 10,000.00”。

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

我在textFieldShouldBeginEditing中做到这一点。

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

textFieldDidEndEditing上,我再次将值重新设置为正确的货币字符串。这也有效。

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

我已经尝试过类似的事情:

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

  • ...但这是行不通的。

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

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

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

    这是一个错误吗?
    extension Double {
        public func doubleToString(numberStyle: NumberFormatter.Style, decimals: Int, withThousandSeparator: Bool) -> String {
            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = numberStyle
            numberFormatter.maximumFractionDigits = decimals
            if !withThousandSeparator {
                numberFormatter.groupingSeparator = ""
            }
            return numberFormatter.string(from: NSNumber(value: self)) ?? ""
        }
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField === self.textField {
            textField.text = amount.doubleToString(numberStyle: .decimal, decimals: 2, withThousandSeparator: false)
        }
    }
    

    最佳答案

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

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

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

    用于textField文本更改的函数:
    func textFieldDidChange(_ textField: UITextField)
    {
        if textField === self.textField
        {
             //try formatting here
        }
    }
    

    关于ios - 意外行为文本textFieldShouldBeginEditing/textFieldDidBeginEditing,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53326641/

    10-10 21:07