使用全局功能添加键盘完成按钮



我正在尝试弄清楚如何创建一个将完成按钮添加到我选择的键盘上的全局函数。

我可以添加一个完成按钮,但是我当前将代码复制到每个视图控制器。我想在UITEXTFIELD上添加一个函数,以在键盘上显示"完成"按钮。当前代码通常在堆栈溢出上找到。

在ViewDidload中找到的代码:

let toolbar = UIToolbar()
toolbar.sizeToFit()
let doneBotton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.doneClicked))
toolbar.setItems([doneBotton], animated: false)

@OBJC在ViewDidload外发现:

@objc func doneClicked() {
    view.endEditing(true)
}

您可以简单地创建一个UITEXTFIELD的扩展名,如下所示: -

extension UITextField {
func addDoneButton() {
    let toolbar = UIToolbar()
    toolbar.sizeToFit()
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneClicked))
    toolbar.setItems([doneButton], animated: false)
    self.inputAccessoryView = toolbar
}
@objc func doneClicked() {
    self.endEditing(true)
}
}

并将其称为下面: -

class DoneKeyboardViewController: UIViewController {
@IBOutlet weak var txtField: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    txtField.addDoneButton()
}
}

您可以尝试UITextField的扩展。

uitextfield的扩展名是全局,TextFieldDone protocol用于标记您选择的键盘。

class ViewController: UIViewController, TextFieldDone {
    @IBOutlet weak var textField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()    
        textField.addDoneButtonOnKeyboard(self)
    }
    @objc
    func doneButtonAction(_ textField: UITextField) {
        print("this")
    }
}
protocol TextFieldDone{
    func doneButtonAction(_ textField: UITextField)
}
extension UITextField: TextFieldDone{
    func addDoneButtonOnKeyboard(_ target: UIViewController)
    {
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
        doneToolbar.barStyle = UIBarStyle.blackTranslucent
        let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: target, action: #selector(doneButtonAction(_:)))
        var items = [UIBarButtonItem]()
        items.append(flexSpace)
        items.append(done)
        doneToolbar.items = items
        doneToolbar.sizeToFit()
        inputAccessoryView = doneToolbar
    }
    @objc func doneButtonAction(_ textField: UITextField){
        print("PlaceHolder")
    }
}

您可以创建一个实现此功能的新视图控制器类,然后将其用作视图控制器其余部分的超级类

您可以通过您提出的实现来亚类UIViewController并覆盖其viewDidLoad,然后将接口构建器中的所有视图控制器类设置为您的派生类,而不是UIViewController

,或者您可以亚类UITextField并将其键盘设置为Done键盘作为INIT方法中的默认值:

class TextField : UITextField {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.returnKeyType = .done
    }
}

然后,在故事板上的任何地方都有一个文本字段,要显示"完成"按钮,将文本字段的类设置为TextField而不是UITextField。您需要initwithCoder,因为那是从故事板创建类时被调用的初始器。

尝试以下:

class CustomTextField: UITextField {
    override init(frame: CGRect) {
        super.init(frame: frame)
        addDoneButtonOnKeyboardToInput()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        addDoneButtonOnKeyboardToInput()
    }
    var doneToolbar: UIToolbar?
    var doneButton: UIBarButtonItem?
    func addDoneButtonOnKeyboardToInput() {
        if (doneToolbar == nil) {
            doneToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
            doneToolbar?.barStyle = UIBarStyle.default
            let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
            doneButton = UIBarButtonItem(title: SF.buttons.done, style: UIBarButtonItem.Style.done, target: nil, action: #selector(doneButtonAction(sender:)))
            var items = [UIBarButtonItem]()
            items.append(flexSpace)
            if let btn = doneButton {
                items.append(btn)
            }
            doneToolbar?.items = items
        }
        doneButton?.target = self
        doneToolbar?.sizeToFit()
        self.inputAccessoryView = doneToolbar
    }
    @objc
    func doneButtonAction(sender: UIBarButtonItem) {
        self.resignFirstResponder()
    }
}

最新更新