首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ObservableObject正在更新所有视图并导致SwiftUI中的菜单关闭。

ObservableObject正在更新所有视图并导致SwiftUI中的菜单关闭。
EN

Stack Overflow用户
提问于 2020-12-01 17:36:40
回答 1查看 341关注 0票数 2

我有一个类,它每3秒调用一个API (使用计时器),并将结果保存在名为@Publisheditems数组中。

代码语言:javascript
运行
复制
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数组,以便在如下列表中显示它:

代码语言:javascript
运行
复制
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中,也有一些MenunavigationBar中,每次apiAdapter更新items变量时都会关闭,因此很难使用它们。

如何可能只更新列表而不更新整个视图?或者更好的是,如何只更新上次api调用中更改的项?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 19:46:59

从您的EnvironmentObject中删除MainListView。为列表创建一个新视图,如下所示:

代码语言:javascript
运行
复制
struct ListView : View {
    @EnvironmentObject var apiAdapter: ApiAdapter

    var body : some View {
        List {
            ForEach(apiAdapter.items, id: \.hash) { i in
                Text(i.name)
            }
        }
    }
}

现在,您的子视图只更新,而您的主视图保持不变,菜单仍然打开。

您的MainListView如下所示:

代码语言:javascript
运行
复制
struct MainListView: View {
    var body: some View {
        NavigationView {
            ListView() //<< here comes your ListView which refreshes independent
            .navigationBarItems(trailing:
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65095562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档