textField.shouldChangeCharactersIn不与盲文屏幕输入一起调用

时间:2018-07-17 06:13:55

标签: ios uiaccessibility

我正在开发使用辅助功能的应用程序。当用户单击UITextField并写字母时,将调用textField.shouldChangeCharactersIn方法。开启或关闭VoiceOver时,不会出现任何问题。但是,如果用户打开盲文屏幕输入,则不会调用textField.shouldChangeCharactersIn方法。

相反,错误被注销:

  

[用户默认设置]无法为密钥写入值   中的VoiceOverHandwritingWasNativeAutocorrectEnabled   CFPrefsPlistSource <0x1d4107860>(域:com.apple.Accessibility,   用户:kCFPreferencesCurrentUser,ByHost:否,容器:(空),   内容需要刷新:是):在   应用程序的容器需要user-preference-write或   文件写入数据沙箱访问,切换为只读

有人可以解释这是什么意思吗?

可以很容易地复制它:

import UIKit

    class ViewController: UIViewController, UITextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let text = UITextField(frame: CGRect(x: 20.0, y: 150.0, width: 200.0, height: 30.0))
        text.delegate = self;
        text.backgroundColor = .gray

        self.view.addSubview(text)
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        print("replacementString : \(string)")
        return true

    }
}

2 个答案:

答案 0 :(得分:1)

我认为这是苹果Api上的错误。该解决方案可能不适合您的用例,但您可以尝试类似的方法。这是使用继承自Textfield的自定义类跟踪文本的替代临时解决方案。

of

然后在您的文本字段委托实现方法中,验证文本以启用或禁用其他按钮。

class AccessibilityTextField: UITextField {
    override func accessibilityElementDidLoseFocus() {
        _ = delegate?.textFieldDidEndEditing?(self)
    }
}

请记住,这不是实时跟踪Text(如range中的char),因为didLoseFocus仅被调用一次。

答案 1 :(得分:0)

使您textField对象成为全局对象,因为它在执行方法viewDidLoad之后立即被释放了。

import UIKit

    class ViewController: UIViewController, UITextFieldDelegate {
    var textField: UITextField?
    override func viewDidLoad() {
        super.viewDidLoad()

        textField = UITextField(frame: CGRect(x: 20.0, y: 150.0, width: 200.0, height: 30.0))
        textField?.delegate = self;
        textField?.backgroundColor = .gray

        self.view.addSubview(textField!)
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        print("replacementString : \(string)")
        return true

    }
}