我正在开发一个 SwiftUI 项目。我创建了一个可以向其传递函数的自定义按钮。看起来如下所示。
自定义按钮
struct CustomButton: View {
let buttonTitle: String
var function: () -> Void
var body: some View {
Button(action: {
self.function()
}, label: {
Text(self.buttonTitle)
}) // Button - Login
} // View
}
在使用它的 View 中,我可以执行以下操作。
struct NewView: View {
var body: some View {
CustomButton(buttonTitle: "Custom Button", function: myFunc)
}
}
func myFunc() {
print("My Custom Button Tapped")
}
这非常有效。
我现在想做的是将参数传递给函数。我在这方面遇到了麻烦。我尝试了以下方法。
struct CustomButton: View {
let buttonTitle: String
var function: (String) -> Void
var body: some View {
Button(action: {
self.function() // I DON'T KNOW WHAT DO TO HERE.
}, label: {
Text(self.buttonTitle)
}) // Button - Login
} // View
}
struct NewView: View {
var body: some View {
CustomButton(buttonTitle: "Custom Button", function: myFunc(text: "Hello"))
}
}
func myFunc(text: String) {
print(text)
}
这不起作用。当我调用 CustomButton 时,出现以下错误。
Cannot convert value of type '()' to expected argument type '() -> Void'
我也不知道要向 Button 操作中的 self.function() 调用添加什么参数。
任何帮助将不胜感激。
最佳答案
首先,最简单的答案 - 通过将 myFunc(text: "Hello")
括在 { }
中,您可以将其变成闭包。然后,它可以传递到您原始的 () -> Void
声明。
struct CustomButton: View {
let buttonTitle: String
let function : () -> Void
var body: some View {
Button(action: {
self.function()
}, label: {
Text(self.buttonTitle)
}) // Button - Login
} // View
}
struct NewView: View {
var body: some View {
CustomButton(buttonTitle: "Custom Button", function: {
myFunc(text: "Hello")
})
}
}
您还可以使用 @autoclosure
来提供类似的行为,而无需 { }
,但您必须声明一个自定义 init
对于您的自定义按钮
:
struct CustomButton: View {
let buttonTitle: String
let function : () -> Void
init(buttonTitle: String, function: @autoclosure @escaping () -> Void) {
self.buttonTitle = buttonTitle
self.function = function
}
var body: some View {
Button(action: {
self.function()
}, label: {
Text(self.buttonTitle)
}) // Button - Login
} // View
}
struct NewView: View {
var body: some View {
CustomButton(buttonTitle: "Custom Button", function: myFunc(text:"Hello"))
}
}
最后,另一种选择(我认为不太可能有用例,但以防万一)是单独传递字符串参数:
struct CustomButton: View {
let buttonTitle: String
let stringParameter : String
let function : (String) -> Void
var body: some View {
Button(action: {
self.function(stringParameter)
}, label: {
Text(self.buttonTitle)
}) // Button - Login
} // View
}
struct NewView: View {
var body: some View {
CustomButton(buttonTitle: "Custom Button", stringParameter: "Hello", function: myFunc)
}
}
关于swift - 将带有参数的闭包传递给 SwiftUI View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69730888/