Использование навигационной ссылки в меню (SwiftUI)

#swiftui

Вопрос:

Можете ли вы использовать a NavigationLink в качестве Menu элемента a в SwiftUI?

Кажется, что это просто ничего не делает:

 Menu {
   NavigationLink(destination: Text("test1")) {
       Text("item1")
   }
   NavigationLink(destination: Text("test2")) {
       Text("item2")
   }
} label: {
   Text("open menu")
}
 

В случае, если предполагается, что это не сработает, как описано выше, существует ли альтернативный способ достижения желаемого результата?

Ответ №1:

NavigationLink должно быть внутри NavigationView иерархии. Это Menu внешний вид навигации, поэтому поместите кнопки внутри меню, которые активируют навигационную ссылку, размещенную внутри вида навигации, например, скрытую в фоновом режиме.

Вот демонстрация возможного подхода (протестирована с Xcode 12.1 / iOS 14.1)

ДЕМОНСТРАЦИЯ

 struct DemoNavigateFromMenu: View {
    @State private var navigateTo = ""
    @State private var isActive = false
    var body: some View {
        NavigationView {
            Menu {
                Button("item1") {
                    self.navigateTo = "test1"
                    self.isActive = true
                }
                Button("item2") {
                    self.navigateTo = "test2"
                    self.isActive = true
                }
            } label: {
                Text("open menu")
            }
            .background(
                NavigationLink(destination: Text(self.navigateTo), isActive: $isActive) {
                    EmptyView()
                })
        }
    }
}
 

Комментарии:

1. Работает просто отлично, я предполагаю, что использование привязки isActive-это (единственный/наилучший) подход для программного перехода к другому представлению в SwiftUI?