如何在Swift的十进制键盘上添加返回键?

问题描述 投票:16回答:4

我在我的应用程序中设置了小数点,但如何解除此键盘?我如何获得完成或返回键?我试过UIReturnKeyType.Done,但没有显示任何东西。

Something like this

这样的事情

ios swift keyboard
4个回答
39
投票

这是一个使用扩展的Swift 3解决方案。如果您的应用程序中有多个数字UITextField对象,则非常理想,因为它可以灵活地为每个UITextField决定是否在点击“完成”或“取消”时执行自定义操作。

enter image description here

//
//  UITextField+DoneCancelToolbar.swift
//

import UIKit

extension UITextField {
    func addDoneCancelToolbar(onDone: (target: Any, action: Selector)? = nil, onCancel: (target: Any, action: Selector)? = nil) {     
        let onCancel = onCancel ?? (target: self, action: #selector(cancelButtonTapped))
        let onDone = onDone ?? (target: self, action: #selector(doneButtonTapped))

        let toolbar: UIToolbar = UIToolbar()
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(title: "Cancel", style: .plain, target: onCancel.target, action: onCancel.action),
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: onDone.target, action: onDone.action)
        ]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    // Default actions:  
    func doneButtonTapped() { self.resignFirstResponder() }
    func cancelButtonTapped() { self.resignFirstResponder() }
}

使用默认操作的使用示例:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { myNumericTextField?.addDoneCancelToolbar() }
}

使用自定义完成操作的使用示例:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { 
        myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField))) 
    }
}

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}

19
投票

这个解决方案适合我=)

资料来源:https://gist.github.com/jplazcano87/8b5d3bc89c3578e45c3e

我为UITextField做了一个扩展,现在我可以在我想要的所有键盘上都有一个“Done Bar”。

extension UITextField{

 func addDoneButtonToKeyboard(myAction:Selector?){
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 300, height: 40))
    doneToolbar.barStyle = UIBarStyle.default

    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: myAction)

    var items = [UIBarButtonItem]()
    items.append(flexSpace)
    items.append(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()

    self.inputAccessoryView = doneToolbar
 }
}

MyViewController

class myViewController:UIViewController,UITextFieldDelegate{

  //MARK: - Outlets
  @IBOutlet weak var myTextField: UITextField!

  //MARK: - Life Cycle
  override func viewDidLoad() {
      super.viewDidLoad()
      myTextField.delegate = self

     //You can specify your own selector to be send in "myAction"
     myTextField.addDoneButtonToKeyboard(myAction:  #selector(self.myTextField.resignFirstResponder))
  }
}

This is the result


1
投票
class ViewController: UIViewController {

    let textField = UITextField(frame: CGRect(x: 0, y: 20, width: 200, height: 60))

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.borderStyle = .Line
        textField.inputAccessoryView = accessoryView()
        textField.inputAccessoryView?.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 44)
        view.addSubview(textField)
    }

    func accessoryView() -> UIView {

        let view = UIView()
        view.backgroundColor = UIColor.redColor()

        let doneButton = UIButton()
        doneButton.frame = CGRect(x: self.view.frame.width - 80, y: 7, width: 60, height: 30)
        doneButton.backgroundColor = UIColor.greenColor()
        doneButton.setTitle("done", forState: .Normal)
        doneButton.addTarget(self, action: #selector(ViewController.doneAction), forControlEvents: .TouchUpInside)
        view.addSubview(doneButton)

        return view

    }

    @objc func doneAction() {
        textField.resignFirstResponder()
    }
}

enter image description here


0
投票

更新@olito回答Swift 4.2对于swift 4选择器必须是objc方法,所以我们必须将@objc添加到扩展内部的函数中

extension UITextField {
func addDoneCancelToolbar(onDone: (target: Any, action: Selector)? = nil, onCancel: (target: Any, action: Selector)? = nil) {
    let onCancel = onCancel ?? (target: self, action: #selector(cancelButtonTapped))
    let onDone = onDone ?? (target: self, action: #selector(doneButtonTapped))

    let toolbar: UIToolbar = UIToolbar()
    toolbar.barStyle = .default
    toolbar.items = [
        UIBarButtonItem(title: "Cancel", style: .plain, target: onCancel.target, action: onCancel.action),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: .done, target: onDone.target, action: onDone.action)
    ]
    toolbar.sizeToFit()

    self.inputAccessoryView = toolbar
}

// Default actions:
@objc func doneButtonTapped() { self.resignFirstResponder() }
@objc func cancelButtonTapped() { self.resignFirstResponder() }}

(确保连接IBOutlet)

    @IBOutlet weak var vehicleModelTF: UITextField!

在viewDidLoad中,我们可以将工具栏添加到textfield。

 myTextField.addDoneCancelToolbar(onDone: (target: self, action: #selector(self.tapDone)), onCancel: (target: self, action: #selector(self.tapCancel)))

现在我们必须添加2个objc方法。

 @objc func tapDone() {
    print("tapped Done")
}

@objc func tapCancel() {
    print("tapped cancel")
}
© www.soinside.com 2019 - 2024. All rights reserved.