0

我有两个视图,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?感谢您的帮助。

4

1 回答 1

0

如果我正确理解您要执行的操作: 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 {
        ...
    }

现在它的主体可以使用这个任务的不同参数。

    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)
                
            }
        })
    
}
于 2021-08-13T21:48:52.527 回答