SwiftUI如何将完成按钮添加到选择器

时间:2020-01-30 16:37:40

标签: xcode swiftui ios13 picker swift5

我已经制作了一个只有一个按钮和一个选择器的迷你应用程序,其想法是在选择器上方有一个完成按钮,因此一旦我选择了一个值,我就可以按完成按钮,选择器将关闭。

我知道,如果您单击“单击我”按钮,它将打开,如果再次单击,则关闭选择器,但是我正在寻找一个与选择器一起出现的按钮,而在单击时消失。

几乎就像选择器上方带有完成按钮的工具栏

    @State var expand = false
    @State var list = ["value1", "value2", "value3"]
    @State var index = 0

    var body: some View {
       VStack {
            Button(action: {
                self.expand.toggle()
            }) {
                Text("Click me \(list[index])")
            }
            if expand {
                Picker(selection: $list, label: EmptyView()) {
                    ForEach(0 ..< list.count) {
                        Text(self.list[$0]).tag($0)
                    }
                }.labelsHidden()
            }

        }

enter image description here

enter image description here enter image description here

第三张图片是我正在努力实现的目标,前两张图片是我当前获得的东西

感谢您的帮助

4 个答案:

答案 0 :(得分:4)

在if子句中添加一个按钮:

if expand {
    VStack{
        Button(action:{self.expand = false}){
            Text("Done")
        }
        Picker(selection: $list, label: EmptyView()) {
            ForEach(0 ..< list.count) {
                Text(self.list[$0]).tag($0)
            }
        }.labelsHidden()
    }
}

答案 1 :(得分:1)

这是我的一种方法...当然仍然可以进行调整(动画,矩形等),但是思想的方向应该明确

结果演示:

enter image description here

代码:

struct ContentView: View {
    @State var expand = false
    @State var list = ["value1", "value2", "value3"]
    @State var index = 0

    var body: some View {
       VStack {
            Button(action: {
                self.expand.toggle()
            }) {
                Text("Click me \(list[index])")
            }
            if expand {
                Picker(selection: $index, label: EmptyView()) {
                    ForEach(0 ..< list.count) {
                        Text(self.list[$0]).tag($0)
                    }
                }.labelsHidden()
                .overlay(
                    GeometryReader { gp in
                        VStack {
                            Button(action: {
                                self.expand.toggle()
                            }) {
                                Text("Done")
                                    .font(.system(size: 42))
                                    .foregroundColor(.red)
                                    .padding(.vertical)
                                    .frame(width: gp.size.width)
                            }.background(Color.white)
                            Spacer()
                        }
                        .frame(width: gp.size.width, height: gp.size.height - 12)
                        .border(Color.black, width: 8)
                    }
                )
            }

        }
    }
}

答案 2 :(得分:1)

这也将起作用(特别是如果您在Vstack之外进行操作)...

   // Toolbar for "Done"
    func createToolbar() {
        let toolBar = UIToolbar()
        toolBar.sizeToFit()

        // "Done" Button for Toolbar on Picker View
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: 
       self, action: #selector(PageOneViewController.dismissKeyboard))

        toolBar.setItems([doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true

        // Makes Toolbar Work for Text Fields
        familyPlansText.inputAccessoryView = toolBar
        kidsOptionText.inputAccessoryView = toolBar
        ethnicityText.inputAccessoryView = toolBar
        }

并确保调用createToolbar()即可!

答案 3 :(得分:0)

struct ContentView: View {
    var colors = ["Red", "Green", "Blue"]
    @State private var selectedColor = 0

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker(selection: $selectedColor, label: Text("Color")) {
                        ForEach(0 ..< colors.count) {
                            Text(self.colors[$0])
                        }
                    }
                }
            }
        }
    }
}

这具有某些特定于表单的选择器行为,它可以内联打开,而无需隐藏按钮。