如何在 SwiftUI 中向 Viewmodifiers 添加闭包?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中向 Viewmodifiers 添加闭包?【英文标题】:How do I add closures to Viewmodifiers in SwiftUI? 【发布时间】:2020-09-27 17:53:46 【问题描述】:

我正在使用 ClearButton ViewModifier here

.modifier(ClearButton(text: $someBinding))

但我想在清除文本字段后运行一个函数。喜欢这个或类似的

.modifier(ClearButton(text: $someBinding)) 
      print("")

有可能吗?

【问题讨论】:

【参考方案1】:

您可以像这样将函数作为参数传递:

struct ClearButton: ViewModifier 
    @Binding var text: String
    var action: () -> Void =  // pass the function here

    public func body(content: Content) -> some View 
        ZStack(alignment: .trailing) 
            content

            if !text.isEmpty 
                Button(action: 
                    self.text = ""
                    action() // call the `action` here
                ) 
                    Image(systemName: "delete.left")
                        .foregroundColor(Color(UIColor.opaqueSeparator))
                
                .padding(.trailing, 8)
            
        
    

并将此修饰符应用于您的 TextField:

struct ContentView: View 
    @State private var text = ""

    var body: some View 
        TextField("Some Text", text: $text)
            .modifier(
                ClearButton(text: $text) 
                    print("TextField cleared")
                
            )
    

请注意,如果您想跳过尾随闭包的标签,action 参数必须放在最后。

【讨论】:

我们可以选择这个吗? @Robert 当然,我更新了我的答案。您可以将 替换为默认行为。您也可以使用var action: (() -> Void)?,但这需要稍后解开可选项。 谢谢@pawello2222 我试过这样但它不起作用。 .modifier(ClearText(text: $name, action: print("234") )) @Robert 不知道你在做什么。你可能没有打电话给action()。我用更详细的解决方案更新了我的答案。 我真的很抱歉。我没有采取行动。我添加了,效果很好。我感激不尽。

以上是关于如何在 SwiftUI 中向 Viewmodifiers 添加闭包?的主要内容,如果未能解决你的问题,请参考以下文章

在 swiftUI 2 中向 MapKit 添加 MapMarker

在 SwiftUI 中向 TextField/SecureField 添加图像,向占位符文本添加填充

在 SwiftUI 中向 NavigationView 添加搜索栏

如何从 MKMapView didSelect 注释更新封装的 SwiftUI 视图

SwiftUI:我可以向 TabView 添加更多视图,然后是选项卡项吗?

如何在 UITabBarController 中向 UINavigationController 添加右键?