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

时间:2019-03-08 00:17:38

标签: ios swift

我试图弄清楚如何创建一个全局功能,该功能可以向我选择的键盘添加完成按钮。

我可以添加一个完成按钮,但是当前我将代码复制到每个视图控件。我想向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)
}

5 个答案:

答案 0 :(得分:2)

您可以简单地创建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()
}
}

答案 1 :(得分:1)

您可以尝试使用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")
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以继承UIViewController的子类,并使用已提供的实现覆盖其viewDidLoad,然后将接口构建器中的所有视图控制器类设置为派生类,而不是UIViewController

或者您可以继承UITextField的子类,并将其键盘的init方法设置为“完成”键盘的默认设置,方法是:

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

然后在情节提要中到处都有要显示完成按钮的文本字段的地方,请将文本字段的类设置为TextField而不是UITextField。您需要使用initWithCoder,因为这是从情节提要中创建类时调用的初始化程序。

答案 4 :(得分:0)

尝试一下:

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()
    }
}