在SwiftUI中如何从上下文菜单中触发导航。

6

我有一个包含在NavigationView中的NavigationLink列表。现在我想通过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)
                            )
                        }
                }
            })
        }
    }
}

我的项目中普通点击的导航工作正常,但是在Xcode 11 Beta 5中上下文菜单却停止了工作。我遇到了以下错误:[WindowServer] display_timer_callback: unexpected state。

我应该如何从上下文菜单中推入一个新视图到我的导航堆栈?


2
这个问题几个月前就有了?你有解决方案吗?我正在尝试相同的实现,没有遇到相同的“display_timer_callback”错误,但是在.contextMenu内导航仍然不起作用。 - drewster
2
很遗憾,@drewster。我用简单的按钮替换了NavigationLink,并在我的导航视图中设置了一个状态来推送新视图。 - jlsiewert
1个回答

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

Full Example

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接