【问题标题】:Swift/SwiftUI Pass different functions into a viewSwift/SwiftUI 将不同的功能传递到视图中
【发布时间】:2023-02-14 21:54:46
【问题描述】:

我正在尝试将不同的功能传递到按钮和 NavigationLink 的自定义样式视图中。

struct commonButtonClass: View {
    let buttonText: String
    
    var body: some View {
        Button(action: {
            // a different function in each instance. it can be for example the login or register function passed in
            }
        }, label: {
            Text(buttonText)
                .font(.system(size:30))
        })
    }
}

但是我找不到将函数传递到视图中的方法。我正在尝试为变量分配 CGFunction,然后在调用此视图时传入 login() 或 register(),但它不起作用。

我对 NavigationLink 的自定义样式的目的地尝试了类似的方法,但分配 View 或 String 允许我将其设置为下一个目的地,如 LoginView() 或 LandingView()。

struct commonNavigationLinkClass: View {
    let target: String
// the desired destination 
    let linkText: String
    
    var body: some View {
        NavigationLink(destination: View(target), label: {
            Text(linkText)
                .font(.system(size:30))
        })
    }
}

对于按钮,我尝试使用 CGFunction 类将函数传递给按钮,但它给了我类和内容不兼容的错误。

对于 NavigationLink,我尝试使用带有视图的字符串(//此处为字符串),但它不起作用。也没有将目标设置为任何视图的类。

也许有更好的方法可以在不传递内容的情况下解决这个问题,但我不太确定如何实现所有这些类型的按钮和 NavigationLink 的样式。除了字体还有其他样式,但它只是颜色和边框所以为了简单起见我删除了它

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您需要将闭包作为参数……

    struct CommonButtonView: View {
    
        let buttonText: String
        let action: () -> Void
        
        var body: some View {
            Button(action: action, label: {
                Text(buttonText)
                    .font(.system(size:30))
            })
        }
    }
    

    然后像这样使用:

    struct ContentView: View {
    
        var body: some View {
            CommonButtonView(buttonText: "Press me") {
                // some action 
            }
        }
    }
    

    但是你最好只使用常规的 Button 并定义你自己的 ButtonStyle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多