TextView 和 TextField 的单一扩展以添加工具栏

Single extension for TextView and TextField to add a toolBar

我想创建一个扩展来在键盘上为 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
}

}

但是在 2 个不同的扩展中具有完全相同的功能是很烦人的。

我尝试像这个问题中那样扩展 UIView 但是我在 inputAccessoryView 中遇到了错误,因为它只是一个 get 属性.

如何分解这两个相同的函数?

也许这会对你有所帮助:

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 { ... }