【问题标题】:NavigationLink inside .searchable does not work.searchable 中的 NavigationLink 不起作用
【发布时间】:2023-03-09 11:55:02
【问题描述】:

我了解它的新功能,但这似乎是非常基本的功能,不在这里。在新的 iOS 15 中实现 .searchable 时,NavigationLink 似乎根本不起作用。

理想情况下,搜索项会生成一个带有 ForEach 的过滤列表,并且对于每个项目,导航链接可以根据您的选择将您带到另一个视图。 ForEach 和列表很有效,看起来很漂亮,但它不会带你去任何地方。

观看 WWDC21,他们谈论了很多关于 .searchable 的话题,但给出的演示/示例却很少..

这是一个简单的例子,没有 ForEach 循环,这表明它根本不起作用。我错过了什么吗?

任何见解表示赞赏:

import SwiftUI

struct ContentView: View {
    
    @State private var term = ""
    
    var body: some View {
        NavigationView {
            Text("Hello, world!")
                .padding()
        }
        .searchable(text: $term) {
            NavigationLink(destination: SecondView()) {
                Text("Go to second view")
            }
        }
    }
}

struct SecondView: View {
    var body: some View {
        Text("Goodbye!")
            .padding()
    }
}

【问题讨论】:

    标签: swift swiftui xcode13 ios15


    【解决方案1】:

    NavigationLink 必须始终在 NavigationView 内,无论如何。如果你想把它放在外面,比如在.searchable里面,你应该使用programmatic navigation with isActive

    struct ContentView: View {
        
        @State private var term = ""
        @State private var isPresenting = false
        
        var body: some View {
            NavigationView {
                
                /// NavigationView must only contain 1 view
                VStack {
                    Text("Hello, world!")
                        .padding()
                    
                    /// invisible NavigationLink
                    NavigationLink(destination: SecondView(), isActive: $isPresenting) { EmptyView()}
                }
            }
            .searchable(text: $term) {
                Button { isPresenting = true } label: {
                    Text("Go to second view")
                }
            }
        }
    }
    
    struct SecondView: View {
        var body: some View {
            Text("Goodbye!")
                .padding()
        }
    }
    

    结果:

    【讨论】:

    • 好的,有道理,谢谢。因此,如果您碰巧有大量的 ForEach 选择列表,我想您必须使用 Buttons 根据用户的选择设置变量,然后触发 NavView 内的 NavLink ..
    • @Lkabo 完全正确。使用设置 NavigationLink 的按钮列表。您可能需要另一个变量来跟踪按下了哪个按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2019-11-15
    • 2021-12-15
    • 2021-05-02
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多