【问题标题】:How to reuse a view in SwiftUI and fill it different data?如何在 SwiftUI 中重用视图并填充不同的数据?
【发布时间】:2021-08-06 06:53:11
【问题描述】:

这里是菜鸟。

所以我编写了一个基本的待办事项应用程序,我需要用户能够编辑他之前输入的任务。为此,我希望通过以下方式重用我的 AddTaskView:一旦我在任务上点击“编辑”,就会显示 AddTaskView 表单并填充所有任务数据,然后按“保存”实际上更新数据,而不是添加一个新任务。

目前,我的 AddTaskView 将所有表单变量存储在@State 变量中,这些变量默认具有值,例如:

@State private var taskTitle : String = "" 

如何将数据发送到已经可用的 AddTaskView,因为任务已经存在以便能够填充适当的字段?我的理解是我不能只从视图外部设置@State 变量值。

当前的 AddTaskView.swift

struct AddTaskView: View {
    //CoreDatas managedObjectEnvironment
    @StateObject var vm : viewModel
    @Environment(\.managedObjectContext) var moc
    @Environment(\.presentationMode) var presentationMode
    var categories : FetchedResults<Category>
    @State private var taskTitle : String = ""
    @State private var taskPriority : String = "Low"
    
    @State private var chosenCategory : String? = ""
    
    @State private var taskDate : Date = Date()
    

    let priorities = ["Low", "High"]
    
    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Task info")) {
                    TextField("Task title", text: $taskTitle)
                    
                }
                Section {
                    DatePicker("Date", selection: $taskDate)
                }
                
                Section {
                    Picker(
                        selection: $taskPriority,
                        label: Text("Priority")
                    ) {
                        ForEach(self.priorities, id: \.self) {
                            Text($0).tag($0)
                        }
                    }
                }
                
                
                Section {
                    Picker(
                        selection: $chosenCategory,
                        label: Text("Category")
                    ) {
                        ForEach(self.categories, id: \.categoryName) { cat in
                            Text(cat.categoryName ?? "Unknown").tag(cat.id)
                        }
                    }
                }
                    
                    
                    
                
                
                Section {
                    Button("Save") {
                        self.vm.addTask(moc: self.moc, title: self.taskTitle, date: self.taskDate, priority: self.taskPriority, chosenCategory: chosenCategory!)
                        self.presentationMode.wrappedValue.dismiss()
                    }
                    
                }
            }
            .navigationTitle("Add Task")
            
        }
        
        
    }

我想从拥有所有任务信息的另一个视图中调用并显示此 AddTaskView。据我了解,我不能只呈现如下视图:

AddTaskView(taskTitle: aTitle, taskPriority: aPriority, etc)

欢迎任何指针。谢谢!

【问题讨论】:

    标签: swift swiftui state reusability


    【解决方案1】:

    你没有问一个小问题。我将建议您通过Apple's Introducing SwiftUI。它将为您提供了解正在发生的事情的基础,但是 TLDR 是每次您更改结构中的 @State 变量时,您都会获得一个全新的结构。结构中的值是不可变的,无论 var 可能暗示什么,您实际上是创建一个新结构并将其放在旧结构的位置。

    并回答您关于呈现视图结构的问题,是的,这会起作用。 AddTaskView() 您设置结构的方式也是如此,尽管它不会显示太多。去打教程。值得花时间。

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多