【问题标题】:How to update array of structure from another view in SwiftUi?如何从 SwiftUi 中的另一个视图更新结构数组?
【发布时间】:2021-09-09 05:09:34
【问题描述】:

在我的 IssueListView 我有一个结构:

struct MyResults: Codable {
var id: Int
var problem: String
var recordDate: String
var isDone: Bool
var finishedDate: String?
var imagePath: String?

}

还有一个State,它是上述结构的数组:

@State private var myresults = [MyResults]()

一切正常,因为我使用这个数组从 API onAppear() 接收数据并将其显示为同一视图中的列表。

问题开始于我决定创建一个新视图 (AddTaskView) 添加任务。

使用 API 成功添加新任务的代码,但之后我必须关闭视图,并且我的列表没有更新,因为 onApear 仅启动一次,我不知道如何更新AddTaskView 内的列表或让 IssueListView 再次加载数据

【问题讨论】:

    标签: swift xcode swiftui


    【解决方案1】:

    方法 1:状态和绑定

    如果myresults 是一个@State 包装变量,你应该在AddTaskView 中有一个@Binding 变量:

    struct IssueListView: View {
      @State private var myresults = [MyResults]()
    
      var body: some View {
        yourContentHere
          .onAppear {
            // Load the data from API here.
          }
          .sheet {
            AddTaskView(myresults: $myresults)
          }
      }
    }
    
    struct AddTaskView: View {
      @Binding var myresults: [MyResults]
    
      var body: some View {
        // ...
      }
    }
    

    AddTaskView 中写入myresults 的任何更改都将反映并更新到IssueListView,只要它在AddTaskView 的初始化程序中传递。

    方法 2:视图模型

    另一个很好的解决方案是在您的应用中使用MVVM architecture。为您的结果列表创建一个视图模型,并将 myresults 作为 @Published 包装属性:

    class ResultsViewModel: ObservableObject {
      @Published var myresults = [MyResults]()
    
      // Add API calls here as methods.
    }
    

    然后,在IssueListView中初始化ResultsViewModel并将其传递给AddTaskView

    struct IssueListView: View {
      @StateObject var viewModel = ResultsViewModel()
    
      var body: some View {
        yourContentHere
          .onAppear {
            viewModel.someAPICall()
          }
          .sheet {
            AddTaskView(viewModel: viewModel)
          }
      }
    }
    
    struct AddTaskView: View {
      @ObservedObject var viewModel: ResultsViewModel
    
      var body: some View {
        // ...
      }
    }
    

    【讨论】:

    • 谢谢,在方法 #1 中,我在 AddTaskView 中收到错误:在调用中缺少参数“myresults”的参数。插入',myresults:#>'
    • 我尝试了很多方法来修复它,1-首先在另一个文件中创建模拟数据,2-通过常量变量 3-通过静态变量。 2、3 删除错误但列表文档更新
    • 由于myresults@Binding 中的AddTaskView 变量,并且它没有初始存储值,Swift 将在初始化AddTaskView 时要求Binding<> 值。因此,请确保在您的视图中调用AddTaskView(myresults: $myresults)$myresults 传递为 Binding<[MyResults]>
    • 我删除了 AddTaskView 预览部分,所以我不需要初始化或传递参数。这是工作!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多