textField.shouldChangeCharactersIn не вызывается с помощью ввода на экране Брайля
Я работаю над приложением, которое использует специальные возможности. Когда пользователь нажимает на UITextField
и пишет письмо, textField.shouldChangeCharactersIn
метод вызывается. Это происходит без проблем, когда VoiceOver включен или выключен. Но если пользователь включит ввод с экрана Брайля, метод textField.shouldChangeCharactersIn не будет вызван.
Вместо этого ошибка выходит из системы:
[Пользовательские значения по умолчанию] Не удалось записать значение для ключа VoiceOverHandwritingWasNativeAutocorrectEnabled в CFPrefsPlistSource<0x1d4107860> (Домен: com.apple.Accessibility, Пользователь: kCFPreferencesCurrentUser, ByHost: Нет, Контейнер: установка (ноль), настройка за пределами: предпочтения вне пределов предпочтения: Содержимое: Обновить) Контейнеру приложения требуется доступ в изолированную программную среду пользователя-записи-записи или файла-записи-данных, переключение в режим только для чтения
Может кто-нибудь объяснить, что это значит?
Это может быть легко воспроизведено с:
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
}
}
1 ответ
Думаю, это ошибка яблочного Api. Это решение может не соответствовать вашему варианту использования, но вы можете попробовать что-то вроде этого. Вот альтернативное временное решение для отслеживания текста с использованием настраиваемого класса, наследующего Textfield.
class AccessibilityTextField: UITextField {
override func accessibilityElementDidLoseFocus() {
_ = delegate?.textFieldDidEndEditing?(self)
}
}
Затем в методе реализации делегата текстового поля проверьте текст, чтобы включить или отключить какую-либо другую кнопку.
extension MyView: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
//Do you check here
}
}
Помните, что это не отслеживание текста в реальном времени (например, char в диапазоне), поскольку didLoseFocus вызывается только один раз.
Сделать вас 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
}
}