使用菜单中的导航链接(SwiftUI)

uqjltbpv  于 2022-12-03  发布在  Swift
关注(0)|答案(2)|浏览(268)

能否在swiftUI中将NavigationLink用作Menu的项?
它似乎什么也不做:

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

如果它不像上面尝试的那样工作,是否有实现预期结果的替代方法?

2jcobegt

2jcobegt1#

自iOS 16起,init(目标:isActive:标签:)已弃用

“init(destination:isActive:label:)”在iOS 16.0中已弃用:在导航堆栈或导航拆分视图中使用导航链接(值:标签:)
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()
                })
        }
    }
}
ltskdhd1

ltskdhd12#

我可以说Asperi的答案是一个很好的解决方案。它帮助了我们很多。但是我们需要一个自定义视图来保存destination属性中的引用,而不是字符串。

@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

相关问题