Search code examples
iosswiftviewkeyboard

How to add Done button on numberpad keyboard for VPMOTPView in swift


I am using VPMOTPView for OTP fields, when i tap on the OTP view here i am getting keyboard with numberpad but here how to add Done Button to keyboard.

enter image description here

I am able to add Done button on keyboard for textfield, but how to add for VPMOTPView.

class OTPViewController: UIViewController {

@IBOutlet weak var otpView: VPMOTPView!
var phone : String?
var otp   : String?

override func viewDidLoad() {
    super.viewDidLoad()
    //self.navigationBarButton()
    otpView.otpFieldsCount = 6
    otpView.otpFieldDefaultBorderColor = UIColor.lightGray
    otpView.otpFieldEnteredBorderColor = UIColor(named: "LightPrimaryColor") ?? UIColor.blue
    otpView.otpFieldErrorBorderColor = UIColor.red
    otpView.otpFieldBorderWidth = 1
    otpView.delegate = self
    otpView.shouldAllowIntermediateEditing = false
    otpView.otpFieldSize = 25
    otpView.otpFieldDisplayType = .underlinedBottom
    otpView.otpFieldEntrySecureType=false
    otpView.initializeUI()
    emailIconLabel.text = "We have sent an sms with OTP \nto \(phone!)"
    self.getOTPService()
}
}

Please help me with the code for adding Done on keyboard.


Solution

  • First introduce this extension on UITextField to add Done button.

    extension UITextField {
    
        /// Adding a done button on the keyboard
        func addDoneButtonOnKeyboard() {
            let doneToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
            doneToolbar.barStyle = .default
    
            let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let done = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction))
    
            let items = [flexSpace, done]
            doneToolbar.items = items
            doneToolbar.sizeToFit()
    
            self.inputAccessoryView = doneToolbar
        }
    
        /// Done button callback
        @objc func doneButtonAction() {
            self.resignFirstResponder()
        }
    }
    

    Now, call the addDoneButtonOnKeyboard method on all the UITextField instances used in the VPMOTPView as below,

    override func viewDidLoad() {
        super.viewDidLoad()
        //self.navigationBarButton()
        otpView.otpFieldsCount = 6
        otpView.otpFieldDefaultBorderColor = UIColor.lightGray
        otpView.otpFieldEnteredBorderColor = UIColor(named: "LightPrimaryColor") ?? UIColor.blue
        otpView.otpFieldErrorBorderColor = UIColor.red
        otpView.otpFieldBorderWidth = 1
        otpView.delegate = self
        otpView.shouldAllowIntermediateEditing = false
        otpView.otpFieldSize = 25
        otpView.otpFieldDisplayType = .underlinedBottom
        otpView.otpFieldEntrySecureType=false
        otpView.initializeUI()
        emailIconLabel.text = "We have sent an sms with OTP \nto \(phone!)"
    
        otpView.subviews.compactMap({ $0 as? VPMOTPTextField}).forEach { tv in
            tv.addDoneButtonOnKeyboard()
        }
        self.getOTPService()
    }