skip to Main Content

I have a first responder textField but I want to be able to close the keyboard when the screen is tapped or when the user presses a button.

Here is my UIViewRepresentable:

public struct CustomSTPPaymentCardTextField: UIViewRepresentable {

@Binding var paymentMethodParams: STPPaymentMethodParams?
let background: Color = ColorManager.backgroundColor

public init(paymentMethodParams: Binding<STPPaymentMethodParams?>) {
    _paymentMethodParams = paymentMethodParams
    
    
}

public func makeCoordinator() -> Coordinator {
    return Coordinator(parent: self)
}

public func makeUIView(context: Context) -> STPPaymentCardTextField {
    let paymentCardField = STPPaymentCardTextField()
    paymentCardField.borderColor = nil
    paymentCardField.borderWidth = 0

    paymentCardField.becomeFirstResponder()
   

    return paymentCardField
}


public func updateUIView(_ paymentCardField: STPPaymentCardTextField, context: Context) {
    
}

public class Coordinator: NSObject, STPPaymentCardTextFieldDelegate {
    var parent: CustomSTPPaymentCardTextField
    init(parent: CustomSTPPaymentCardTextField) {
        self.parent = parent
    }

}

}

Here is how I called it in the view:

CustomSTPPaymentCardTextField(paymentMethodParams: $paymentMethodParams)

I’ve tried to pass a binding boolean to activate endEditing

I’ve also tried to use the following function:

#if canImport(UIKit)
extension View {
    func hideKeyboard() {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}
#endif

I’ve also tried the following:

UIApplication.shared.resignFirstResponder()

I’ve tried all of the above methods with and without DispatchQueue.main.async but none of them seem to work.

Any help is appreciated! 🙂

3

Answers


  1. Add an action to any button or in viewWillDisappear method inside UIViewController class

    self.view.endEditing(true)
    

    add this line. This will dismiss keyboard and stops editing.

    Login or Signup to reply.
  2. You’re almost correct with the extension on View

    Use endEditing on all the windows. That can be called from anywhere.

    extension View {
      static func endEditing() {
        UIApplication.shared.windows.forEach { $0.endEditing(false) }
      }
    }
    

    That approach might not be correct if you had a multi-scene app.

    Login or Signup to reply.
  3. It Worked fine for me.

    #if canImport(UIKit)
    extension View {
        func hideKeyboard() {
            UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
        }
    }
    #endif
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search