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

Posted

技术标签:

【中文标题】SwiftUI 如何创建一个将项目添加到包含导航链接的列表的按钮【英文标题】:SwiftUI How to Create a button that adds an item to a list that contains a navigation link 【发布时间】:2019-10-24 22:26:33 【问题描述】:

我以前从未在这方面发过帖子,所以希望设置正确。

我是 swift 新手,我想创建一个按钮,将新项目添加到列表中,该列表包含指向文件的导航链接,该文件将使用上一个项目的链接数据创建,但我没有经过几天的研究和测试,找到了任何方法来做到这一点。

这是我的应用程序目前最终想要的布局:Q1,这是我提到的不同 Q1-4 视图的预览:Q1-4

我知道这很多,所以让我更深入地解释一下:我想要一个包含在所谓的“Q1”(如上所示)中的列表,该列表以“第 1 周”开头,当您单击添加按钮,我希望它添加一个“第 2 周”等最多 10 周。一旦达到 10 周,我希望用户必须更改为不同的视图,“Q2”,然后他们可以添加第 11-20 周,依此类推,直到第 4 季度,这将其限制为总共 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】:

我不太确定我是否理解正确,但我做了一个非常简单的例子来回答你的标题问题

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)
    

【讨论】:

以上是关于SwiftUI 如何创建一个将项目添加到包含导航链接的列表的按钮的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 导航栏项目中难以点击的按钮

在 SwiftUI 中向 NavigationView 添加搜索栏

Swift:将 SwiftUI 元素添加到 UIKit 项目:无法正确应用约束

如何在 SwiftUI 的按钮中添加导航按钮链接?

SwiftUI - 如何将工具栏添加到 NavigationView 内的 TabView 选项卡?

如何将管理页面项添加到导航栏中(对于超级用户)? [复制]