我试图弄清楚如何创建一个全局功能,该功能可以向我选择的键盘添加完成按钮。
我可以添加一个完成按钮,但是当前我将代码复制到每个视图控件。我想向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)
}
答案 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()
}
}