簡體   English   中英

在 shouldChangeTextInRange 方法中返回 false 自動將所有字母大寫

[英]Returning false in shouldChangeTextInRange method auto capitalize all letters

我在最新的 iOS 版本中看到 UITextView 的一個奇怪問題。 根據我目前的理解,它僅發生在 iOS 13 中。我的一位用戶在 iOS 12.4.1 上報告了此問題,盡管我無法在任何 Z1BDF605991920DB11ZCBDF13508204C4EB 之前的設備上重現此問題。

我在 Xcode 11 中創建了一個小示例項目來解釋這個問題。 該項目的目標是 iOS 13。我正在運行 iOS 13.1.2 (17A860) 的 iPhone 8 上進行測試。 該項目包含一個簡單的視圖 controller 和 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  
    }  
}  

這是整個代碼,除了 storyboard 和其他項目文件。 正如您在上面看到的,我只是將用戶輸入的完全相同的文本手動設置到 textview 中,然后返回 false。 但是當我輸入時,第一個字符會被添加到大寫字母中。 第二個字符正確地以小寫字母添加。 從第三個字符開始,一切都大寫。 此外,在鍵入每個字符后,鍵盤切換按鈕會自動被選中。 附上截圖。

在此處輸入圖像描述

其他一些重要的點。

  1. 僅當 autocapitalizationType 為“sentences”時才會出現此問題,而不是“words”、“none”等其他值。
  2. 我嘗試在代碼和 storyboard 中設置 autocapitalizationType,結果相同。
  3. 如果我不實現 shouldChangeTextInRange 方法,則不會重現問題。 如果我從此方法返回 true,則不會重現問題。 由於需要在這個方法中做一些處理,所以需要返回false。
  4. 然而,我自己在 iOS 13 之前的設備上重現,盡管用戶在 iOS 12.4.1 上報告了這一點(目前未經驗證)。

任何人都可以為此問題提出修復/解決方法嗎?

嘗試在主循環中安排這個賦值語句:

    textView.text = newString

變成:

    DispatchQueue.main.async {
        textView.text = newString
    }

這對我來說成功地解決了一個類似的問題,即句子的前兩個字母被大寫。 我最好的猜測是 UITextView 的 text 屬性的didSet偵聽器背后的邏輯以一種立即同步觸發委托的方式發生了變化。 在主隊列上異步調度分配強制/保證委托在第二次被解雇之前返回。

到目前為止,我發現的最佳解決方法是在textViewDidChange中進行處理。

此處還討論了該錯誤: Apple 開發者論壇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM