SwiftUI如何创建将项目添加到包含导航链接的列表的按钮

时间:2019-10-24 22:26:33

标签: swiftui swiftui-list

我以前从未对此发表过文章,因此希望此设置正确。

我是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 :(得分:0)

我不确定我是否理解正确,但是我举了一个非常简单的示例来回答您的头衔问题

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