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.

Некоторые примечания:

  1. Вам необходимо использовать список внутри NavigationView (NavigationStack для iOS17, поскольку NavigationView устарел)

  2. даже если документы 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: "")
         }
     }
    

    }

Другие вопросы по тегам