在shouldChangeTextInRange方法中返回false,会自动将所有字母大写

问题描述 投票:2回答:1

我在最新的iOS版本中看到UITextView的一个奇怪问题。根据我目前的理解,它仅在iOS 13中发生。我的一个用户在iOS 12.4.1上报告了此问题,尽管我无法在任何iOS 13之前的设备上重现此问题。

我已经在Xcode 11中创建了一个小示例项目来解释该问题。该项目面向iOS13。我正在运行iOS 13.1.2(17A860)的iPhone 8上进行测试。该项目包含一个带有textview的简单视图控制器。 TextView具有autoCapitalizationType作为“句子”。然后,我实现了委托方法shouldChangeTextInRange方法。参见下面的代码

class ViewController: UIViewController {  
    @IBOutlet weak var textView: UITextView!  
    override func viewDidLoad() {  
        super.viewDidLoad()  
        self.textView.delegate = self  
        self.textView.autocapitalizationType = .sentences  
    }  
}  
  
extension ViewController: UITextViewDelegate {  
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange,
      replacementText text: String) -> Bool {  
        //I wanted to do some other modifications here, but for now just
        //setting the user typed text manually and returning false  
        if let oldString = textView.text {  
            let newString = oldString.replacingCharacters(in: Range(range, in: oldString)!,  
                                                          with: text)  
            textView.text = newString  
        }  
        return false  
    }  
}  

这是整个代码,但情节提要和其他项目文件除外。如您在上面看到的,我只是将用户输入的完全相同的文本手动设置到textview中,然后返回false。但是,当我键入内容时,第一个字符会按需添加到大写字母中。第二个字符正确以小写字母添加。从第三个角色开始,所有内容均显示上限。此外,键入每个字符后,键盘移位按钮会自动被选择。附有屏幕截图。

enter image description here

一些其他要点。

  1. 仅当autocapitalizationType为“句子”,而不是其他值,例如“ words”,“ none”。
  2. 我试图在代码和情节提要中设置autocapitalizationType,结果相同。
  3. 如果我不实现shouldChangeTextInRange方法,则不会出现问题转载。如果我从此方法返回true,则不会出现问题转载。由于我需要使用这种方法进行一些处理,因此需要返回false。
  4. 但仍要由用户自己在iOS 13之前的设备上复制在iOS 12.4.1上报告了此问题(目前尚未验证)。

有人可以针对此问题提出修复/解决方法吗?

ios uitextview ios13 capitalization iphone-softkeyboard
1个回答
0
投票

到目前为止,我发现的最佳解决方法是改为在textViewDidChange中进行处理。

该错误也在这里讨论:Apple developer forum

© www.soinside.com 2019 - 2024. All rights reserved.