NavigationLink внутри .searchable не работает
Я понимаю, что это новое, но это кажется довольно простой функциональностью, которой здесь нет. При реализации в новой iOS 15 может показаться, что NavigationLink вообще не работает.
В идеале функция поиска должна создавать отфильтрованный список с ForEach, и для каждого элемента навигационная ссылка может перенаправить вас в другое представление на основе вашего выбора. ForEach и list работают и выглядят красиво, они никуда не приведут.
Смотря WWDC21, они ужасно много говорят о
Вот простой пример без цикла 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()
}
}
2 ответа
NavigationLink
всегда должен быть внутри
NavigationView
, не важно что. Если вы хотите поставить его снаружи, как внутри
.searchable
, вам следует использовать программную навигацию с
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()
}
}
Результат:
мои 2 цента с использованием данных из документов Apple.
Некоторые примечания:
Вам необходимо использовать список внутри NavigationView (NavigationStack для iOS17, поскольку NavigationView устарел)
даже если документы Apple (и многие в Интернете) говорят об этом, без 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: "") } }
}