swift - 如何从 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加载再次数据
解决方案
方法 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 的任何更改myresults
都AddTaskView
将反映和更新,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 {
// ...
}
}