在UITextView委托中设置属性文本时,光标和文本不同步

时间:2019-05-15 19:30:33

标签: ios uitextview nsattributedstring uitextviewdelegate

我有一个UITextView正在从用户那里获取输入。我想用属性文本替换输入文本。当前,我正在使用textView(_:shouldChangeTextIn:replacementText:)设置文本视图的attributedText属性,然后返回false。除了添加或删除初始字符时,光标与输入的字母不同步外,这似乎工作正常。有时光标会在文本出现之前跳出,有时文本会在光标移回之前被删除。有什么办法可以使它们保持同步?

这并非一直发生,因此您必须继续删除并重新键入第一个字符。您可以在模拟器和5s上看到它,但是在X上看不到它。

这是一个例子:

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textView = UITextView()
        textView.delegate = self
        textView.frame = {
            var result = view.bounds
            let top: CGFloat = 50.0
            result.size.height -= top
            result.origin.y += top
            return result
        }()
        view.addSubview(textView)
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text:     String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }
        let text = (textView.text as NSString).replacingCharacters(in: range, with: text)
        let attributes: [NSAttributedString.Key: Any] = [
            .font: UIFont.systemFont(ofSize: 17.0, weight: .bold)
        ]
        textView.attributedText = NSAttributedString(
            string: text,
            attributes: attributes)
        return false
    }
}

0 个答案:

没有答案