如何在 SwiftUI 中结束 UIViewRepresentable 的编辑?
Posted
技术标签:
【中文标题】如何在 SwiftUI 中结束 UIViewRepresentable 的编辑?【英文标题】:How to endEditing on UIViewRepresentable in SwiftUI? 【发布时间】:2021-08-20 02:29:38 【问题描述】:我有一个第一响应者textField
,但我希望能够在点击屏幕或用户按下按钮时关闭键盘。
这是我的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
这是我在视图中的调用方式:
CustomSTPPaymentCardTextField(paymentMethodParams: $paymentMethodParams)
我尝试传递一个绑定布尔值来激活endEditing
我也尝试过使用以下功能:
#if canImport(UIKit)
extension View
func hideKeyboard()
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
#endif
我还尝试了以下方法:
UIApplication.shared.resignFirstResponder()
我已经尝试了上述所有方法,无论是否使用DispatchQueue.main.async
,但它们似乎都不起作用。
感谢任何帮助! :)
【问题讨论】:
您在问题中发布了很多特定于应用程序的代码,您可以对其进行编辑以获得minimal reproducible example吗? @Cristik 完成。请立即查看,如果您有任何建议,请告诉我。 【参考方案1】:在 UIViewController 类内的 viewWillDisappear 方法或任何按钮上添加一个动作
self.view.endEditing(true)
添加这一行。这将关闭键盘并停止编辑。
【讨论】:
我的视图是 SwiftUI 视图【参考方案2】:View
上的 extension
几乎是正确的
在所有窗口上使用endEditing
。可以从任何地方调用。
extension View
static func endEditing()
UIApplication.shared.windows.forEach $0.endEditing(false)
如果您有一个多场景应用程序,这种方法可能不正确。
【讨论】:
【参考方案3】:对我来说效果很好。
#if canImport(UIKit)
extension View
func hideKeyboard()
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
#endif
【讨论】:
以上是关于如何在 SwiftUI 中结束 UIViewRepresentable 的编辑?的主要内容,如果未能解决你的问题,请参考以下文章