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

    }
}
Другие вопросы по тегам