【问题标题】:Passing data across views for unique objects in a forEach loop in swift快速在 forEach 循环中跨视图传递数据以获取唯一对象
【发布时间】:2021-07-28 05:41:16
【问题描述】:

我有两个视图,ViewAssignment 和 TaskDetailView。我的 ViewAssignment 页面从环境对象中获取数据,并使用该数据创建一个列表。

单击列表中的每个项目后,TaskDetailView 会作为导航链接弹出,但是,我无法使 TaskDetailView 中的信息对特定迭代(列表中的项目)唯一

我相信问题出在我的 TaskDetailView.swift

import SwiftUI

struct TaskDetailView: View {
    @EnvironmentObject var assignment: Assignments
    @State var taskNotes = ""
    var body: some View {
        VStack(spacing: 10) {
            Image("english-essay")
                .resizable()
                .scaledToFit()
                .frame(width: 250, height: 160)
                .cornerRadius(20)
            
            
            Text(self.assignment.data.first?.taskName ?? "Untitled Task")
                .font(.title2)
                .fontWeight(.semibold)
                .lineLimit(2)
                .multilineTextAlignment(.center)
            
            
            
            
            HStack(spacing: 20) {
                Label(self.assignment.data.first?.weighting ?? "0", systemImage: "percent")
                    .font(.subheadline)
                    .foregroundColor(.secondary)
                
                Text(self.assignment.data.first?.dueDate ?? "No Date")
                    .font(.subheadline)
                    .foregroundColor(.secondary)
            }
            
            TextField("Write any notes here", text: $taskNotes)
                .font(.body)
                .padding()
            
            Spacer()
            
        }
        
    }
}

struct TaskDetailView_Previews: PreviewProvider {
    static var previews: some View {
        TaskDetailView() // I assume there is some information I have to pass through here
    }
}

详细来说,这是我的另一种看法:

import SwiftUI

struct ViewAssignment: View {
    
    // Observed to update the UI
    @EnvironmentObject var assignment: Assignments
    
    var body: some View {
        ZStack {
            NavigationView {
                
                List(self.assignment.data) { task in
                    NavigationLink (
                        destination: TaskDetailView(),
                        label: {
                            Image(systemName: "doc.append.fill")
                                .scaleEffect(2.5)
                                .padding()
                            
                            VStack(alignment: .leading, spacing: 3) {
                                
                                Text(task.taskName)
                                    .fontWeight(.semibold)
                                    .lineLimit(2)
                                
                                Text(task.dueDate + " - " + task.subject)
                                    .font(.subheadline)
                                    .foregroundColor(.secondary)
                            }
                        })
                    
                }
                .navigationTitle("My Tasks")
                .listStyle(InsetGroupedListStyle())
                
                
            }
            
        }
    }
    
}








struct ViewAssignment_Previews: PreviewProvider {
    static var previews: some View {
        ViewAssignment()
    }
}

我还想知道,在为列表中的每个项目设置唯一屏幕后,我是否能够在重新加载应用程序时保存文本字段的内容,也许通过@AppStorage? 感谢您的帮助。

【问题讨论】:

    标签: swiftui swiftui-list swiftui-navigationlink swiftui-navigationview swiftui-environment


    【解决方案1】:

    如果我正确理解您要执行的操作: TaskDetailView 显示 ... 任务的详细信息。 所以你应该有一个这样的任务结构:

    struct Task {
        let name: String
        let subject: String
        ...
    
    }
    

    您必须创建一个(或多个)Task 实例来测试您的 TaskDetailView:

    extension Task {
        var test: Task {
            Task(name: "Test", subject: "Test Subject")
        }
    }
    

    现在在 TaskDetailView 的预览中,您可以尝试显示您的示例:

    struct TaskDetailView_Previews: PreviewProvider {
        static var previews: some View {
            TaskDetailView(task: Task.test) // here
        }
    }
    

    目前什么都没有发生。因为你的 TaskDetailView 没有任务参数。

    struct TaskDetailView: View {
        
        var task: Task
        
        var body: some View {
            ...
        }
    
    

    现在它的body可以使用这个Task的不同参数了。

        Text(task.name)
                    .font(.title2)
                    .fontWeight(.semibold)
                    .lineLimit(2)
                    .multilineTextAlignment(.center)
    

    现在在您的列表中:

    List(self.assignment.data) { task in
        NavigationLink (
            destination: TaskDetailView(task: task),    // <-  here !!!
            label: {
                Image(systemName: "doc.append.fill")
                    .scaleEffect(2.5)
                    .padding()
                
                VStack(alignment: .leading, spacing: 3) {
                    
                    Text(task.name)
                        .fontWeight(.semibold)
                        .lineLimit(2)
                    
                }
            })
        
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      相关资源
      最近更新 更多