gpt4 book ai didi

navigation - 深度编程 SwiftUI NavigationView 导航

转载 作者:行者123 更新时间:2023-12-04 11:33:52 24 4
gpt4 key购买 nike

我正在尝试按顺序获得一个深层嵌套的编程导航堆栈。当手动完成导航(即:按下链接)时,以下代码按预期工作。当您按下 Set Nav按钮导航堆栈确实发生了变化 - 但不像预期的那样 - 你最终会得到一个损坏的堆栈 [start -> b -> bbb] View 之间有很多翻转

class NavState: ObservableObject {
@Published var firstLevel: String? = nil
@Published var secondLevel: String? = nil
@Published var thirdLevel: String? = nil
}

struct LandingPageView: View {

@ObservedObject var navigationState: NavState

func resetNav() {
self.navigationState.firstLevel = "b"
self.navigationState.secondLevel = "ba"
self.navigationState.thirdLevel = "bbb"
}

var body: some View {

return NavigationView {
List {
NavigationLink(
destination: Place(
text: "a",
childValues: [ ("aa", [ "aaa"]) ],
navigationState: self.navigationState
).navigationBarTitle("a"),
tag: "a",
selection: self.$navigationState.firstLevel
) {
Text("a")
}
NavigationLink(
destination: Place(
text: "b",
childValues: [ ("bb", [ "bbb"]), ("ba", [ "baa", "bbb" ]) ],
navigationState: self.navigationState
).navigationBarTitle("b"),
tag: "b",
selection: self.$navigationState.firstLevel
) {
Text("b")
}

Button(action: self.resetNav) {
Text("Set Nav")
}
}
.navigationBarTitle("Start")
}
.navigationViewStyle(StackNavigationViewStyle())
}
}


struct Place: View {
var text: String
var childValues: [ (String, [String]) ]

@ObservedObject var navigationState: NavState

var body: some View {
List(childValues, id: \.self.0) { childValue in
NavigationLink(
destination: NextPlace(
text: childValue.0,
childValues: childValue.1,
navigationState: self.navigationState
).navigationBarTitle(childValue.0),
tag: childValue.0,
selection: self.$navigationState.secondLevel
) {
Text(childValue.0)
}
}
}
}

struct NextPlace: View {
var text: String
var childValues: [String]

@ObservedObject var navigationState: NavState

var body: some View {
List(childValues, id: \.self) { childValue in
NavigationLink(
destination: FinalPlace(
text: childValue,
navigationState: self.navigationState
).navigationBarTitle(childValue),
tag: childValue,
selection: self.$navigationState.thirdLevel
) {
Text(childValue)
}
}
}
}

struct FinalPlace: View {
var text: String
@ObservedObject var navigationState: NavState

var body: some View {
let concat: String = "\(navigationState.firstLevel)/\(navigationState.secondLevel))/\(navigationState.thirdLevel)/"

return VStack {
Text(text)
Text(concat)
}
}
}

我最初试图将导航过渡动画作为问题源来解决 - 但 How to disable NavigationView push and pop animations暗示这是不可配置的

是否有任何关于 >1 级程序化导航的合理示例?

编辑:我希望在这里获得的部分内容也是导航正常工作的初始状态 - 如果我从具有导航状态的外部上下文进入我希望反射(reflect)(即:从具有一些应用程序内上下文的通知开始从,或从保存到磁盘编码状态)然后我希望能够加载顶部 View导航正确指向正确的 subview 。本质上 - 替换 nil s 在 NavState具有实际值(value)。 Qt 的 QML 和 ReactRouter 都可以声明性地做到这一点——SwiftUI 也应该能够做到。

最佳答案

这是因为动画完成时会形成新的堆栈级别,这就是它在手动点击的情况下起作用的原因。

通过以下修改,它可以工作:

func resetNav() {
self.navigationState.firstLevel = "b"
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.navigationState.secondLevel = "ba"
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.navigationState.thirdLevel = "bbb"
}
}
}

关于navigation - 深度编程 SwiftUI NavigationView 导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59403359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com