我正在开发使用辅助功能的应用程序。当用户单击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
}
}
答案 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
}
}