首页 > 解决方案 > 如何从 SwiftUi 中的另一个视图更新结构数组?

问题描述

在我的IssueListView 中,我有一个结构:

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

}

和一个状态,它是上述结构的数组:

@State private var myresults = [MyResults]()

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

当我决定创建一个新视图AddTaskView来添加任务时,问题就开始了。

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

标签: swiftxcodeswiftui

解决方案


方法 1:状态和绑定

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

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 {
    // ...
  }
}

写入 inside 的任何更改myresultsAddTaskView将反映和更新,IssueListView只要它在AddTaskView的初始化程序中传递。

方法二:视图模型

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

class ResultsViewModel: ObservableObject {
  @Published var myresults = [MyResults]()

  // Add API calls here as methods.
}

ResultsViewModel然后,初始化IssueListView并将其传递给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 {
    // ...
  }
}

推荐阅读