代码之家  ›  专栏  ›  技术社区  ›  Lance Samaria

Swift-Force UITextview仅小写

  •  1
  • Lance Samaria  · 技术社区  · 4 年前

    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”时,我得到一个小字母和一个大写字母,然后当我按backspace键时,我得到: [__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds

    2 回复  |  直到 4 年前
        1
  •  0
  •   aheze But I'm Not A Wrapper Class    4 年前

    而不是 shouldChangeTextIn ,使用 textViewDidChange .

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

    结果:

    Typing while keyboard caps lock is on, but the text entered turns out all lowercased

        2
  •  2
  •   Sweeper    4 年前

    您重写了错误的委托方法。 shouldChangeTextIn 应该 换衣服。您应该使用此方法来防止用户输入某些字符。

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

    指定的委托方法 实施是:

    func textViewDidChange(_ textView: UITextView)
    

    这个函数实际上是在文本更改后调用的。在这里,你可以做你做过的事情,就像 UITextField

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

    您似乎还将文本视图的最大长度限制为200个字符。这种功能应该保持不变 应该更改文本输入 . 看到了吗 this post