从 SwiftUI 中的上下文菜单触发导航

jls*_*ert 6 swiftui

我有一个List包含NavigationLinkNavigationView. 我知道想用ContextMenu包含一个元素的来扩展视图,该元素在我的导航堆栈中显示另一个视图。

struct MainView: View {
    @State var elements = ["Hello", "World"]

    var body: some View {
        NavigationView {
            List(elements, id: \.self, rowContent: { element in
                NavigationLink(destination: PresentView(element: element)) {
                    Text(element)
                        .contextMenu {
                            NavigationLink(
                                "Edit",
                                destination: EditView(element: element)
                            )
                        }
                }
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正常点击我的项目的导航工作正常。然而,上下文菜单在 Xcode 11 Beta 5 中停止工作。我收到以下错误:`[WindowServer] display_timer_callback:意外状态。

如何从上下文菜单中将新视图推送到我的导航堆栈上?

Ali*_*Ali 0

一种方法是使用NavigationLink(destination: Destination, isActive: Binding<Bool>, @ViewBuilder label: () -> Label),将标签作为EmptyView隐藏在 a 内ZStack。然后,您可以选择要导航到的元素并切换contextMenu. 这是一个完整的示例:

完整示例

struct PresentView: View {
    let element: String

    var body: some View {
        Text(element)
    }
}

struct EditView: View {
    let element: String

    var body: some View {
        Text("EditView for \(element)")
    }
}

struct MainView: View {
    @State var elements = ["Hello", "World"]

    @State var elementToEdit: String?
    @State var isPresentedEditView = false

    var body: some View {
        NavigationView {
            ZStack {

                NavigationLink(
                    destination: elementToEdit == nil ? AnyView(EmptyView()) : AnyView(EditView(element: elementToEdit!)),
                    isActive: $isPresentedEditView) {
                        EmptyView()
                    }

                List(elements, id: \.self) { element in
                    NavigationLink(destination: PresentView(element: element)) {
                        Text(element)
                            .contextMenu {
                                Button("Edit") {
                                    elementToEdit = element
                                    isPresentedEditView.toggle()
                                }
                            }
                    }
                }
            }
        }
    }
}

struct ContentView: View {
    var body: some View {
        MainView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)