【问题标题】:Swift -Force UITextview Lowercase OnlySwift -Force UITextview 仅小写
【发布时间】:2023-03-08 07:00:02
【问题描述】:

要强制 UITextfield 仅使用小写,我执行以下操作:

lazy var myTextField: UITextField = {
    let textField = UITextField()
    textField.addTarget(self, action: #selector(forceLettersLowercased(_ :)), for: .editingChanged)
    return textField
}()

@objc func forceLettersLowercased(_ sender: UITextField) {
    sender.text = sender.text?.lowercased()
}

如何使用 UITextView 实现相同的功能?

lazy var myTextView: UITextView = {
    let textView = UITextView()
    return textView
}()

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
      
    let textLowerCased = text.lowercased()

    textView.text = (textView.text as NSString).replacingCharacters(in: range, with: textLowerCased)

    let numberOfChars = textView.text.count
    
    return numberOfChars <= 200
}

我不断收到双字母,例如当我输入字母“W”时,我得到一个小字母和一个大写字母,然后当我按退格键时,我得到:[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds

【问题讨论】:

  • 奇怪,我想弄清楚为什么你的索引超出范围,但我实际上无法重现错误......
  • 我不知道。我正在处理另一个错误。完成后我会回到这个,再次重现它,然后向你解释我采取了哪些步骤。

标签: ios swift uitextview


【解决方案1】:

您覆盖了错误的委托方法。 shouldChangeTextIn,顾名思义,是一个委托方法,它询问您是否应该更改给定范围内的文本应该。您应该使用此方法,例如阻止用户输入某些字符。

它恰好在文本视图的文本发生更改时被调用,但这并不意味着您应该使用它来检测文本视图中正在更改的文本,因为该方法将被调用 before 文本已更改,这是有道理的:它会在实际更改之前询问您是否应该更改文本。这就是为什么有两个W。第一个小写 w 来自您设置文本视图的文本,第二个大写 W 来自用户实际输入。

应该实现的委托方法是:

func textViewDidChange(_ textView: UITextView)

这实际上是在文本更改后调用的。在这里你可以做和UITextField一样的事情:

textView.text = textView.text?.lowercased()

您似乎还将文本视图的最大长度限制为 200 个字符。该功能应保留在shouldChangeTextIn 中。如果您不确定如何执行此操作,请参阅 this post

【讨论】:

  • 感谢您的建议。我选择@aheze,因为他首先发布了答案,所以这是正确的。我赞成你的回答,因为它的解释很好。
  • 是的,这是一个非常好的解释。已投票。
【解决方案2】:

请使用textViewDidChange,而不是shouldChangeTextIn

extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        textView.text = textView.text.lowercased()
    }
}

结果:

【讨论】:

  • 好的,谢谢,我会在 5 分钟内尝试并通知您
猜你喜欢
  • 2015-07-28
  • 2014-05-27
  • 1970-01-01
  • 2015-05-03
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多