Published on

记录一个iOS和macOS使用导航的区别

Authors

记录一个iOS和macOS使用导航的区别

iOS的用法

List {
            ForEach(groupedArticles.indices, id: \.self) { index in
                let header =  (groupedArticles[index].first?.typeName()) ?? ""
                Section(header: Text(header)) {
                    ForEach(groupedArticles[index], id: \.id) { article in
                        NavigationLink(value: article) {
                            ArticleItemView(article: article)
                        }
                    }
                }
            }
        }
        .navigationTitle("跟打")
        .navigationDestination(for:Article.self) { article in
            TypingView(article:article)
                .toolbar(.hidden, for: .tabBar)
     }

macOS的用法

 List(selection: $selected) {
            ForEach(groupedArticles.indices, id: \.self) { index in
                let header =  (groupedArticles[index].first?.typeName()) ?? ""
                Section(header: Text(header)) {
                    ForEach(groupedArticles[index], id: \.self) { article in
                        ArticleItemView(article: article)
                    }
                }
            }
        }

其中的区别是在List中是否需要传 selection,如果是通过NavigationLink的方式,不需要传 selection参数。因为其中的选中项的处理是由 NavigationLink + navigationDestination来决定的

如果在macOS中,不使用NavigationLink,我们采用的是NavigationSplit方案,如果我们的List是处于其中的ContentView,我们会通过selection来决定NavigationSplit中的detailView中的数据。

1

所以需要传入selection。

如果我们在iOS的方案中,不小心也传入了selection,那么会导致NavigationLink + navigationDestination 这套机制不生效。从而导致在iOS上点击List中的Item不跳转的情况。