Одно расширение для TextView и TextField для добавления панели инструментов - PullRequest
1 голос
/ 21 апреля 2020

Я хочу создать одно расширение для добавления панели инструментов на клавиатуре для TextView и TextField.

Сейчас я делаю это как для TextView, так и для TextField:

extension UITextView {
func setKeyboardToolBar(items: [UIBarButtonItem]) {
    let screenWidth = UIScreen.main.bounds.width
    let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0))
    toolBar.setItems(items, animated: false)
    self.inputAccessoryView = toolBar
}

}

Но досадно иметь одинаковую функцию в двух разных расширениях.

Я пытался расширить UIView, как в этом вопросе Одиночное расширение для UITextView и UITextField в Swift но я получил ошибку с inputAccessoryView, потому что это свойство get only.

Как можно разложить эти две одинаковые функции?

1 Ответ

1 голос
/ 22 апреля 2020

Может быть, это вам поможет:

extension UITextField: KeyboardToolbarCompatible {}
extension UITextView: KeyboardToolbarCompatible {}

protocol KeyboardToolbarCompatible: AnyObject {
    func setKeyboardToolBar(items: [UIBarButtonItem])
    var inputAccessoryView: UIView? { get set }
}

extension KeyboardToolbarCompatible {
    func setKeyboardToolBar(items: [UIBarButtonItem]) {
        let screenWidth = UIScreen.main.bounds.width
        let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0))
        toolBar.setItems(items, animated: false)
        self.inputAccessoryView = toolBar
    }
}

Если это необходимо только для TextView и TextField, то KeyboardToolbarCompatible может подтвердить UITextInput.

protocol KeyboardToolbarCompatible: UITextInput { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...