我有一个类,它每3秒调用一个API (使用计时器),并将结果保存在名为@Published
的items
数组中。
public class ApiAdapter: ObservableObject {
@Published var items = [Item]()
init() {
api = Api(...)
Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { timer in
api.getItems() { items in
if let _items = items {
self.items = _items
}
}
}
}
}
整个应用程序都使用ApiAdapter,所以我决定让它成为@EnvironmentObject
。
在我的应用程序的主视图中,我访问apiAdapter.items
数组,以便在如下列表中显示它:
struct MainListView: View {
@EnvironmentObject var apiAdapter: ApiAdapter
var body: some View {
NavigationView {
List {
ForEach(apiAdapter.items, id: \.hash) { i in
Text(i.name)
...
}
}
.navigationBarItems(trailing:
Menu {
Picker(selection: $category, label: Text("Filter")) {
Text("Category 1").tag(1)
Text("Category 2").tag(2)
Text("Category 3").tag(3)
}
} label: {
Image(systemName: "line.horizontal.3.decrease.circle")
.imageScale(.large)
}
}
}
}
在MainListView中,也有一些Menu
在navigationBar
中,每次apiAdapter
更新items
变量时都会关闭,因此很难使用它们。
如何可能只更新列表而不更新整个视图?或者更好的是,如何只更新上次api调用中更改的项?
发布于 2020-12-01 19:46:59
从您的EnvironmentObject
中删除MainListView。为列表创建一个新视图,如下所示:
struct ListView : View {
@EnvironmentObject var apiAdapter: ApiAdapter
var body : some View {
List {
ForEach(apiAdapter.items, id: \.hash) { i in
Text(i.name)
}
}
}
}
现在,您的子视图只更新,而您的主视图保持不变,菜单仍然打开。
您的MainListView如下所示:
struct MainListView: View {
var body: some View {
NavigationView {
ListView() //<< here comes your ListView which refreshes independent
.navigationBarItems(trailing:
https://stackoverflow.com/questions/65095562
复制相似问题