web-dev-qa-db-ja.com

Swiftの10進パッドにリターンキーを追加する方法は?

アプリに10進数パッドを設定していますが、このキーボードを閉じるにはどうすればよいですか?完了キーまたはリターンキーを取得するにはどうすればよいですか?私はもう試した UIReturnKeyType.Doneしかし、それは何も表示しませんでした。

Something like this

そんな感じ

18
Amit Kalra

これは、拡張機能を使用したSwift 3ソリューションです。 Done または Cancel時にカスタムアクションを実行するかどうかを各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() }
}

カスタム Done アクションを使用した使用例:

//
// MyViewController.Swift
//

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

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

このソリューションは私のために働いた=)

ソース: https://Gist.github.com/jplazcano87/8b5d3bc89c3578e45c3e

UITextFieldの拡張機能を作成し、必要なすべてのキーボードに「完了バー」を設定できるようになりました。

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

19
Karen Gonzalez
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

1
maquannene

Swift 4.2の@olito回答を更新します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では、ツールバーをテキストフィールドに追加できます。

 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")
}
0
ShadeToD