swift searchable内部的NavigationLink不起作用

fhg3lkii  于 2023-08-02  发布在  Swift
关注(0)|答案(2)|浏览(104)

我知道它的新,但这似乎是相当基本的功能,不在这里。当在新的iOS 15中实现.searchable时,NavigationLink似乎根本不起作用。
理想情况下,可搜索的将生成一个带有ForEach的过滤列表,对于每个项目,一个导航链接可以根据您的选择将您带到另一个视图。Foreach和列表的工作和看起来很漂亮,它只是不会带你去任何地方。
观看WWDC 21,他们谈了很多关于.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()
    }
}

字符串

zujrkrfu

zujrkrfu1#

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()
    }
}

字符串
测试结果:


的数据

pxyaymoc

pxyaymoc2#

我的2美分使用苹果文档的数据。
一些注意事项:
1.您必须在NavigationView中包含列表(iOS17的NavigationStack,因为NavigationView已被弃用)
1.即使苹果的文档(和网络上的许多)似乎是这样说的,没有Nav..XX不工作:尝试自己评论Nav..XX

import SwiftUI

 struct Ocean: Identifiable {
     let name: String
     let id = UUID()
 }

 struct ContentView: View {

 private var oceans = [
     Ocean(name: "Pacific"),
     Ocean(name: "Atlantic"),
     Ocean(name: "Indian"),
     Ocean(name: "Southern"),
     Ocean(name: "Arctic")
 ]

 @State private var searchText = ""

 var body: some View {
     NavigationStack { // Try to commenting out.

         let filtered = self.oceans.filter { (ocean : Ocean) in
             return ocean.name.uppercased().contains(searchText.uppercased()) || searchText.isEmpty
         }
         List(filtered) { (ocean: Ocean) in
             Text(ocean.name)
         }
         .searchable(text: $searchText, prompt: "")
     }
 }

字符串
}

相关问题