在菜单中使用 NavigationLink(SwiftUI)

13
你可以在SwiftUI中使用NavigationLink作为Menu的项目吗?
它似乎什么都没有发生:
Menu {
   NavigationLink(destination: Text("test1")) {
       Text("item1")
   }
   NavigationLink(destination: Text("test2")) {
       Text("item2")
   }
} label: {
   Text("open menu")
}

如果上述方法不能正常工作,是否有其他实现预期结果的替代方法?
2个回答

15

init(destination:isActive:label:) 在iOS 16中已经被弃用

'init(destination:isActive:label:)'在iOS16.0中已被废弃:请在NavigationStack或NavigationSplitView内使用NavigationLink(value:label:)

NavigationLink应该在NavigationView层次结构中。 Menu在导航视图之外,因此将按钮放置在菜单内,以激活放置在导航视图内的导航链接,例如隐藏在后台。

这是可能方法的演示(在Xcode 12.1 / iOS 14.1上测试过)

demo

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

运行得很好,我认为在SwiftUI中编程式导航到不同视图的最佳实践是使用isActive绑定吗? - Leo

3

我可以说Asperi的回答是一个很好的解决方案,它帮了很大的忙。但我们需要一个自定义视图来在目标属性中持有一个引用,而不是一个字符串。

@State var navigateTo: AnyView?
@State var isNavigationActive = false

我们可以持有一个 AnyView 类型的引用,然后像这样调用视图:
Menu {
    Button {
        navigateTo = AnyView(CreateItemView())
        isNavigationActive = true
    } label: {
        Label("Create an Item", systemImage: "doc")
    }
    
    Button {
        navigateTo = AnyView(CreateItemView())
        isNavigationActive = true
    } label: {
        Label("Create a category", systemImage: "folder")
    }
} label: {
    Label("Add", systemImage: "plus")
}

更多细节请参见此帖子: https://developer.apple.com/forums/thread/119583


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