如何在 swiftUI 中选择项目时在选择器上添加操作?

Posted

技术标签:

【中文标题】如何在 swiftUI 中选择项目时在选择器上添加操作?【英文标题】:How do I add action on picker on selection of item in swiftUI? 【发布时间】:2020-03-02 14:31:49 【问题描述】:

我有一个带有某些项目列表(比如添加、编辑、删除)的选择器,在选择特定项目时,我需要移动到不同的屏幕。我试过 onTapGuesture() 但是当我调试它时控制不会进入内部。

【问题讨论】:

onChange 函数应该可以工作,然后发送一个被选中的标识符并更新一个状态以移动到新视图 【参考方案1】:

我找到了 3 种不同的方法来实现这一目标。我拍的最后一张here。所以,有这些方法,你可以选择你想要的:

struct PickerOnChange: View 

    private var options = ["add", "edit", "delete"]
    @State private var selectedOption = 0
    @State private var choosed = 0

    var body: some View 

        VStack 

            Picker(selection: $selectedOption.onChange(changeViewWithThirdWay), label: Text("Choose action")) 
                ForEach(0 ..< self.options.count) 
                    Text(self.options[$0]).tag($0)
                
            .pickerStyle(SegmentedPickerStyle())

            // MARK: first way
            VStack 
                if selectedOption == 0 
                    Text("add (first way)")
                 else if selectedOption == 1 
                    Text("edit (first way)")
                 else 
                    Text("delete (first way)")
                

                Divider()

                // MARK: second way
                ZStack 

                    AddView()
                        .opacity(selectedOption == 0 ? 1 : 0)

                    EditView()
                        .opacity(selectedOption == 1 ? 1 : 0)

                    DeleteView()
                        .opacity(selectedOption == 2 ? 1 : 0)
                

                Divider()

                // MARK: showing third way
                Text("just to show, how to use third way: \(self.choosed)")

                Spacer()

            

        

    

    func changeViewWithThirdWay(_ newValue: Int) 
        print("will change something in third way with: \(choosed), you can do everything in this function")
        withAnimation 
            choosed = newValue
        

    



// MARK: the third way
extension Binding 
    func onChange(_ handler: @escaping (Value) -> Void) -> Binding<Value> 
        return Binding(
            get:  self.wrappedValue ,
            set:  selection in
                self.wrappedValue = selection
                handler(selection)
        )
    

您将使用代码 sn-p 实现此目的:

【讨论】:

var options = ["General", "About"] @State private var selectedOption = 0 如果我需要从模型类中读取数据并设置默认选中项,我应该使用@Binding 吗? @RamyaSharma 你是什么意思? 如果我的选项数组来自模型类,我应该使用@ObservedObject 吗?另外,在这种情况下如何设置默认状态? 我收到错误 -> 无法在属性初始化程序中使用实例成员“ModelClass”;如果我尝试设置 @State var selected = ModelClass.options[0],则属性初始化程序在“self”可用之前运行 @RamyaSharma 我认为最好用您的代码 sn-p 和错误消息提出另一个问题。我现在还不太清楚,你想实现什么以及你想如何处理你的数据

以上是关于如何在 swiftUI 中选择项目时在选择器上添加操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的日期选择器上启用未来年份?

取消选择 SwiftUI 列表中的项目会使应用程序崩溃

选择添加到 SwiftUI 列表的新项目

SwiftUI:添加元素时选择器内容未刷新

在 swiftUI 列表中添加、选择和删除文件名 - MacOS

选择下拉选项时在表单中添加输入字段