如何把用户在选择器中的选择传递给按钮,以便执行相应的函数?
我有一个用于选择函数的选择器,以及一个按钮,想在按钮上处理用户的选择以执行相应的函数。我写了段代码,大体上能实现这个功能,但问题在于我必须用“Text”把用户在选择器中的选择映射到按钮上。我相信还有一种更简单的做法——把用户的选择直接从选择器传递给按钮,而不使用“Text”。
下面是我的代码:
import SwiftUI
import Foundation
struct ContentView: View {
//Identify picker's states
enum myFuncPicker: String, CaseIterable, Identifiable {
case myfunc1
case myfunc2
case myfunc3
var id: Self { self }
}
//set default state for picker
@State private var selectedFunction: myFuncPicker = .myfunc1
//string variable for working with functions
@State private var SelectMyFuncString: String = "func1"
var body: some View {
VStack {
//select function picker
Picker(selection: $selectedFunction, label: Text("select Function")) {
Text("myfunc1").tag(myFuncPicker.myfunc1)
Text("myfunc2").tag(myFuncPicker.myfunc2)
Text("myfunc3").tag(myFuncPicker.myfunc3)
}
//switch for sending user's choice to my button
switch selectedFunction {
case .myfunc1:
Text("function number one selected").onAppear {SelectMyFuncString = "func1"}
case .myfunc2:
Text("function number two selected").onAppear {SelectMyFuncString = "func2"}
case .myfunc3:
Text("function number three selected").onAppear {SelectMyFuncString = "func3"}
}
Button(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/) {
switch SelectMyFuncString {
case "func1":
print("func1")
case "func2":
print("func2")
case "func3":
print("func3")
default:
print("No func selected")
}
}
.padding()
.frame(width: 400.0, height: 400.0)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
}
解决方案
你也可以在按钮动作的代码中使用枚举。
Button("Button") {
switch selectedFunction {
case .myfunc1:
print("func1")
case .myfunc2:
print("func2")
case .myfunc3:
print("func3")
}
}
或者你可以把这部分放进枚举中,让代码更清晰一些。
enum myFuncPicker: String, CaseIterable, Identifiable {
//...
func excute() {
switch self {
case .myfunc1:
print("func1")
case .myfunc2:
print("func2")
case .myfunc3:
print("func3")
}
}
}
这样,按钮的动作就变成了
Button("Button") {
selectedFunction.excute()
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。