SwiftUI - NavigationLink内容加载过早

6
我在第一个视图中有一个基本列表,如下所示:
func buildList(sections: [Client]) -> some View {
    let list = List {
        ForEach(sections) { client in
            Section(header: Text(client.name)) {
                ForEach(client.projects) { project in
                    NavigationLink(destination: BuildsRouter.build(forProject: project)) {
                        HStack {
                            Text("Test \(project.id)").fontWeight(.ultraLight)
                        }
                    }
                }
            }
        }
    }
    return  list
}

我正在使用NavigationLink为我的Project对象提供详细视图。

问题是,当我制作内存分析图时,我可以看到从BuildsRouter.build(forProject: project)创建的BuildsView实际点击导航链接之前就已经被创建了

问题: 是否有任何方法可以在单击链接后才创建详细视图?


3
NavigationLink包装在LazyView<Content: View>中是解决方法。参见 https://dev59.com/I1MH5IYBdhLWcg3wxijj。 - lorem ipsum
1个回答

4

没错,我在这篇博客文章中写过。您可以将目标视图包装在惰性容器中以解决此问题。更新:从Xcode 11.4.1开始,默认情况下NavigationLinks是惰性的。


5
我不认为这是正确的。我使用的是Xcode 11.4.1,NavigationLink目标视图在应用启动时被加载。 - Brett
奇怪,iOS 版本 13.4.1 或以上也是这样吗? - AnupamChugh
1
是的,这也不是每个情况都会出现。有些导航链接在应用程序启动时加载,而有些则是懒加载的,我还没有确定模式。目前我正在使用 objc.io 的解决方案来解决这个问题。 - Brett
即使在11.4.1中已经修复了这个问题,这是否意味着我们需要将所有NavigationLink视图包装在延迟加载包装器中,因为iOS 13的早期版本仍然存在这个问题? - Zorayr
我建议将它们包装在Lazy中,因为该问题在11.5中再次出现。 - AnupamChugh
这是懒加载的一个很好的解决方法。谢谢! - Bartosz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接