我正在從事一個 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
}
在使用它的視圖中,我可以執行以下操作。
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 時,出現以下錯誤。
無法將“()”型別的值轉換為預期的引數型別“() -> Void”
我也不知道要在 Button 操作中的 self.function() 呼叫中添加什么引數。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
首先,最簡單的答案——通過將 括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")
})
}
}
您也可以使用 an@autoclosure在沒有 的情況下提供類似的行為{ },但您必須init為您的宣告一個自定義CustomButton:
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)
}
}
uj5u.com熱心網友回復:
在這里,您可能正在尋找:
struct ContentView: View {
let action: (String) -> Void = { value in print(value) }
var body: some View {
CustomButtonView(string: "print", valueToSend: "Hello World!", action: action)
}
}
struct CustomButtonView: View {
let string: String
let valueToSend: String
let action: (String) -> Void
var body: some View {
Button(string) {
action(valueToSend)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/338937.html
標籤:迅速
