【问题标题】:How to Access the objects from NavigationStack in SWIFTUI? I am using iOS 16 NavigationStack如何在 SWIFTUI 中访问 NavigationStack 中的对象?我正在使用 iOS 16 NavigationStack
【发布时间】:2023-02-24 07:33:02
【问题描述】:

我想在 NavigationStack 中从 View PathS 转到 PathS,withOut 创建一个新的 PathB 对象,也不删除导航堆栈层次结构中的 PathC 的视图实例。

细节:

@State var path: [String] = []

// or this can also be written
//@State var path: NavigationPath = NavigationPath()

var body: some View {
        NavigationStack(path: $path) {
            ZStack{         
                Text("SomeThing")
            }
            .navigationDestination(for: String.self, destination: { path in 
                switch path {      
                case "pathA" :
                   PathA().navigationBarBackButtonHidden()
                case "pathB":
                    PathB().navigationBarBackButtonHidden()
                case "pathC":
                    PathC().navigationBarBackButtonHidden()
                default:
                    PathD().navigationBarBackButtonHidden()
                }
            })

在这里我尝试的是在某些视图中完成导航时匹配参考名称

 path.append("pathA")

现在考虑我正在查看 PathS()。我想导航回 PathB。一种选择是四处滑动,但我禁用了导航后退按钮。

所以我要做的是

来自 PathS

path.append("pathB")

这将创建一个新的 PathB() 视图,而不是返回到我拥有的视图。

现在我的要求是返回到我创建的 PathB() 而不是新对象。

如果我的解释不够充分,请随时发表评论

【问题讨论】:

  • path 数组在您要从PathD 移动到PathB 时的全部内容是什么?
  • @ScottThompson,最初它是一个空数组,但在 PathD 时,它应该包含路径:[String] = ["pathA","pathB","pathC","pathD"]。

标签: ios swift swiftui combine


【解决方案1】:

我会做类似的事情:

var newPath = Array(path.prefix(while: {$0 != "pathB"}))
newPath.append("pathB")
path = newPath

给出path = ["pathA","pathB","pathC","pathD"]

这应该将path设置为["pathA", "pathB"]

【讨论】:

  • 这将破坏“pathC”和“pathD”中的路径信息。正确的。我之前用 functions.contain() 和 filter() 尝试过类似的方法。但是有没有办法保存创建的实例,这样我就可以在已经启动的情况下选择我想要的实例? developer.apple.com/documentation/swiftui/… 这是您可以查找的参考。有一个名为 read..() 的函数,我相信它可以以某种方式提供帮助。
  • Navigation Stack 是一种用于呈现按层次结构排列的一组页面的工具。用户将页面推入堆栈,然后可以导航回该堆栈。我不清楚你想要完成什么。我不明白您所说的“保存创建的实例,以便我可以选择已经启动的实例”是什么意思。保存什么的实例?
【解决方案2】:

在 iOS < 16.0 中,您可以使用 PresentationMode 关闭当前视图并返回上一个视图,即“向后导航”:

// Auto-injected environment variable (no need to manually .environment it)
@Environment(.presentationMode) var mode: Binding<PresentationMode>

func navigateBack() { mode.wrappedValue.dismiss() }

对于 iOS 16 及更高版本,这已被 isPresenteddismiss 取代。后者可用于等效的“向后导航”。

private struct SheetContents: View {
    @Environment(.dismiss) private var dismiss

    var body: some View {
        Button("Go to Previous View") {
            dismiss()
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 2022-09-29
    • 2022-11-03
    • 2022-08-23
    • 2022-10-06
    • 2022-10-14
    • 2023-01-24
    • 2022-12-12
    • 2019-01-07
    相关资源
    最近更新 更多