Я создал подклассы от класса UITextField, поэтому я могу предоставить некоторые встроенные функции для своего приложения. Я изменил внешний вид, чтобы обеспечить только подчеркивание границы для дизайна UX. Кроме того, я хочу использовать этот элемент управления в ситуациях, когда есть средство выбора (список выбора, средство выбора даты / времени). В этих случаях я хочу предотвратить редактирование, НО мне все равно нужно реагировать на события касания. Для этого я добавил проверяемые свойства, чтобы управлять им из IB.
Я могу легко предотвратить появление меню копирования / вставки, выполнив следующие действия:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if isFirstResponder && disableEditing {
DispatchQueue.main.async(execute: {
(sender as? UIMenuController)?.setMenuVisible(false, animated: false)
})
return false
}
return super.canPerformAction(action, withSender: sender)
}
Однако мне нужно запретить им вводить или удалять символы в текстовом поле после того, как что-то выбрано в средстве выбора. Как правило, вы должны использовать следующий метод делегата:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return false
}
Вопрос в том, как обеспечить такое поведение по умолчанию в подклассе? Вы можете сделать:
self.delegate = self
Однако это приводит ко всевозможным недостаткам, так что это не лучшее решение.
Другое решение - реализовать базовый подкласс UIViewController (MyBaseViewController), но позже это приведет к запутанному и монолитному коду.
Было бы лучше, если бы существовал чистый способ обеспечить такое поведение по умолчанию в инкапсулированном виде.
Очевидно, есть несколько других способов исправить это (например, написать тот же код в 10 контроллерах представления). По сути, кажется, что должен быть способ повторно использовать код делегата при создании подклассов таких элементов управления.
У кого-нибудь есть идеи ??
hasSelectedOption
. Вы должны установить для него значение true / false в зависимости от других действий с элементом управления (например, выбрать параметр из раскрывающегося списка), а затем запустить другой вход в свой подкласс в зависимости от значения этого свойства. Я правильно понимаю ваш вопрос? - person Alex   schedule 26.10.2017