Swift 中 UITextView 和 UITextField 的单一扩展

Single extension for UITextView and UITextField in Swift

我想为 UITextFieldUITextView 创建一个 扩展 并向其添加以下方法:

    func addDoneButtonOnKeyboardWith(selector : Selector)
    {
        let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
        let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        keyBoardToolBar.items = [flexibleSpace, barButtonItem]
        keyBoardToolBar.barStyle = .default
        self.inputAccessoryView = keyBoardToolBar
        self.reloadInputViews()
    }

我希望扩展方法仅适用于 UITextFieldUITextView

也许这会奏效,因为 UIView 是它们的父级 class,缺点是这可能会出现在各种视图中,不确定是否有其他方法可以实现您的目标需要:

extension UIView  {
    func addDoneButtonOnKeyboardWith(selector : Selector)
    {
        if self is UITextField || self is UITextView {
            //do something
        }
    }
}

最接近的 class,您可以扩展的是 UIControl,您可以扩展它,但是 UIButtons 和其他控件将再次访问此方法。

因此您可以使用静态方法扩展或子class 例如 UIBarButtonItem。

class func addDoneBarButtonOnKeyboardFor(keyInput: UIControl <UIKeyInput>, usingSelector : Selector)
{
    let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
    let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    keyBoardToolBar.items = [flexibleSpace, barButtonItem]
    keyBoardToolBar.barStyle = .default
    keyInput.inputAccessoryView = keyBoardToolBar
    keyInput.reloadInputViews()
}

抱歉,如果在 Swift 代码中出现错误。现在在 Obj C 上开发。

我有一个想法可以做你想做的事,利用协议的默认实现。 技术上您仍然需要两个扩展,但它们都将完全是空的。考虑以下因素:

为您的方法创建协议,并提供默认实现:

protocol DoneButtonBearer {
    func addDoneButtonOnKeyboardWith(selector: Selector)
}

extension DoneButtonBearer {
    func addDoneButtonOnKeyboardWith(selector: Selector) {
        var view: UIView?
        defer  {
            if view != nil {
                let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
                let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
                let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
                keyBoardToolBar.items = [flexibleSpace, barButtonItem]
                keyBoardToolBar.barStyle = .default
                view!.inputAccessoryView = keyBoardToolBar
                view!.reloadInputViews()
            }
        }
        if let textField = self as? UITextField {
            view = textField
            return
        }
        if let textView = self as? UITextView {
            view = textView
            return
        }
    }
}

然后只需使用此功能扩展 UITextFieldUITextView

extension UITextField: DoneButtonBearer { }

extension UITextView: DoneButtonBearer { }