如何把用户在选择器中的选择传递给按钮,以便执行相应的函数?

编程语言 2026-07-11

我有一个用于选择函数的选择器,以及一个按钮,想在按钮上处理用户的选择以执行相应的函数。我写了段代码,大体上能实现这个功能,但问题在于我必须用“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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章