如何使用自定义UI和编程导航在SwiftUI中正确构建导航?

ff29svar  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(174)

我正在使用SwiftUI开发一个应用程序,其中我使用多个视图。我的应用程序的设置视图使用了一个带有导航按钮的自定义UI,而不是List。我以前使用的是NavigationView,但由于折旧,我改用NavigationStack。我不确定我是否正确地实现了这一点。
我的应用程序的层次结构如下:
Jmeter 板>应用程序设置>帐户设置>更改信息>姓名/电子邮件/电话/密码/...>更改信息视图。
在我的应用程序的设置部分,根是“应用程序设置”视图,其中包含各种其他设置视图,如“帐户设置”。一些视图需要在函数运行后以编程方式更改,因此我不能对按钮使用NavigationLink
下面是我当前结构的一个例子:
设置视图:

Button(action: {
    print("user pressed")
}, label: {
    NavigationLink(destination: {
        SettingsProfileView()
    }, label: {
        // UI code omitted for brevity
    })
})

帐户设置视图:

Button(action: {
    print("Age Restriction Pressed")
    withAnimation(.easeInOut(duration: 0.2)) {
    }
}, label: {
    NavigationLink(destination: {
        AccountInfoSubView()
    }, label: {
        // UI code omitted for brevity
    })
})

我遇到的问题是“验证当前密码”视图,该视图在用户可以更改密码之前验证用户的当前密码。在用户更改密码并单击保存后,应该返回到上一个视图。然而,.navigationDestination似乎没有识别出当isPresented不再为真时,它不会返回到前一个视图。
验证当前密码视图:

.navigationBarItems(trailing:
    Button(action: {
        isPresented = true
    }) {
        Text("Next")
            .foregroundColor(UserValidate().isPasswordValid(textField) ? .orange : .gray)
    }
    .navigationDestination(isPresented: $isPresented, destination: {
        PasswordChangeView(isPresented: $isPresented)
    })
)
.preferredColorScheme(.dark)
.padding()

最后,“更改帐户密码”视图:

.navigationBarItems(trailing: Button(action: {
    isPresented = false
}))

最后一个视图不会返回到前一个视图,即使isPresented现在为false。如何正确地构建导航,使视图的行为符合预期?

h4cxqtbf

h4cxqtbf1#

我认为你正在使用旧的坏方法来设置你的导航流的目的地。

  • 首先:定义你的navigationLink和每个链接设置值,这将是一个关键。(你可以为此写一个枚举)
  • 第二:在一个 Package 器中放入导航目的地,读取该枚举并返回要显示的视图
NavigationStack {
    List {
        NavigationLink("Mint", value: Color.mint)
        NavigationLink("Pink", value: Color.pink)
        NavigationLink("Teal", value: Color.teal)
    }
    .navigationDestination(for: Color.self) { color in
        ColorDetail(color: color)
    }
    .navigationTitle("Colors")

我将与你分享一个帖子和一个视频,其中解释得更好。
https://www.avanderlee.com/swiftui/navigationlink-programmatically-binding/
https://www.youtube.com/watch?v=piAiy5vlC9k&t=3566s&ab_channel=KarinPrater

相关问题