SwiftUI Как создать кнопку, которая добавляет элемент в список, содержащий навигационную ссылку - PullRequest
0 голосов
/ 25 октября 2019

Я никогда не делал постов по этому вопросу раньше, так что, надеюсь, это настроено правильно.

Я новичок в swift, и я хочу создать кнопку, которая добавляет новый элемент в список, который содержит навигационную ссылку на файл, который он будет создавать со связанными данными из предыдущего элемента, и яЯ не нашел способа сделать это, потратив несколько дней на исследования и тестирование.

Вот как мое приложение выглядит в настоящее время для макета, который я хочу получить в итоге: Q1 ,и вот предварительный просмотр различных представлений Q1-4, о которых я упоминал: Q1-4

Я знаю, что это много, поэтому позвольте мне объяснить более подробно: я хочу иметь списоксодержится в том, что называется «Q1» (как видно выше), которое начинается с «Недели 1», и когда вы нажимаете кнопку «Добавить», я хочу, чтобы оно добавляло «Недели 2» и т. д. до 10 недель. После того, как вы наберете 10 недель, я хочу, чтобы пользователю пришлось перейти на другое представление, «Q2», которое затем он может добавить в неделю 11–20 и т. Д. До Q4, что ограничивает его до 40 недель. Я хочу, чтобы каждую неделю содержалась навигационная ссылка на новый вид;однако я также хочу перенести данные с предыдущей недели, как только я создам новую неделю, чтобы пользователю не пришлось вручную вводить данные за предыдущую неделю.

Я знаю, как сделать это, используя файл JSON для чисел, поскольку я видел учебники по этому вопросу, однако я не вижу в этом смысла, так как мне нужны только данныедля числа недели 1-40, но я не могу заставить его работать с массивом или чем-то еще. Я знаю, что могу использовать @EnvironmentObject для получения необходимых мне данных с других страниц, но я не совсем уверен, как их настроить. Кроме этого, я застрял! Вот мой код:

import SwiftUI

struct BillsView: View {

    @State private var quarterNumber = 0

    let quarterNumbers = [1, 2, 3, 4]

    var body: some View {
        NavigationView{
            VStack {
               Section {
                    Picker("Quarter Number", selection: $quarterNumber) {
                        ForEach(0 ..< quarterNumbers.count) {
                            Text("Q\(self.quarterNumbers[$0])")
                        }
                    }
                    .pickerStyle(SegmentedPickerStyle())
                    .padding(.horizontal)
                    if quarterNumber == 0 {
                        Q1View()
                    } else if quarterNumber == 1 {
                        Q2View()
                    } else if quarterNumber == 2 {
                        Q3View()
                    } else if quarterNumber == 3 {
                        Q4View()
                    }
                }
            Spacer()
            }

            .navigationBarTitle("Bills")
            .navigationBarItems(leading: EditButton(),
            trailing: Button(action: {
                //Adds the new week
            }){
                Image(systemName: "plus.circle.fill")
            })

        }
    }
}

struct Q1View: View {

    @State private var weekNumber = 0

    let weekNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    var body: some View {
        List {
            NavigationLink(destination: Week1View()) {
                Text("Week 1")
            }
        }
    }
}

struct Week1View: View {
    var body: some View {
        List {
            link(label: "Gross Income", destination: GrossIncome())
            link(label: "Expenses", destination: Expenses())
        }.navigationBarTitle(Text("Week 1"), displayMode: .inline)
    }

    private func link<Destination: View>(label: String, destination: Destination) -> some   View {
        return NavigationLink(destination: destination) {
                Text(label)
        }
    }
}

1 Ответ

0 голосов
/ 26 октября 2019

Я не совсем уверен, правильно ли я вас понял, но я сделал очень простой пример, который отвечает на вопрос о вашем названии

import SwiftUI

struct ContentView: View {

    @State private var list : [String] = ["Chris"]
    @State private var quarterNumber = 0

    var body: some View {
        Group () {
            Button(action: {
                self.list.append("whatever")
            }) {
                Text("tap me")
            }
            NavigationView{

                List(list, id: \.self) { item in

                    NavigationLink(
                        destination: View2(text: "hallo")
                            .navigationBarTitle(Text("Categories"), displayMode: .automatic)
                    ) {
                        Text("Categories")
                    }.isDetailLink(false) // damit der Doof nicht rechts das nächste Menu öffnet

                }
            }
        }
    }
}

struct View2: View {

    var text : String

    var body: some View {

        Text(text)
    }
}
...