SwiftUI Как добавить готовую кнопку в пике - PullRequest
1 голос
/ 30 января 2020

Я создаю мини-приложение с помощью только кнопки и средства выбора, и идея состоит в том, чтобы над кнопкой выбора была кнопка «Готово», поэтому после выбора значения можно нажать «Готово», и средство выбора закроется.

Я знаю, что если вы нажмете кнопку «щелкнуть меня», она откроется, и если вы нажмете ее снова, закройте средство выбора, но я ищу кнопку, которая появляется вместе со средством выбора и исчезает при нажатии кнопки щелчка.

Почти как панель инструментов над подборщиком с кнопкой «Готово»

    @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

Третье изображение - это то, что я пытаюсь выполнить sh, а первые два - то, что у меня сейчас есть

Спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Добавить кнопку в условие 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 голос
/ 30 января 2020

Также это будет работать (особенно если вы делаете это вне 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 (), и все готово!

1 голос
/ 30 января 2020

Вот подход, как я бы это сделал ... конечно, настройка все еще возможна (анимации, тикеты и т. Д. c.), Но направление идеи должно быть ясным

Демонстрация результата :

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)
                    }
                )
            }

        }
    }
}
...