如何在 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 的编辑?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中等待音频完成?

如何在 SwiftUI 中查找滚动视图内容是不是已到达内容的末尾

如何在 SwiftUI 中以编程方式滚动列表?

如何将页脚视图添加到 SwiftUI 中的列表?

SwiftUI脑洞大开打造实时显示当前值的Slider

SwiftUI脑洞大开打造实时显示当前值的Slider(滑动器)