如何解决尝试孙子上一个下一个导航时,Parent-Child-Grandchild场景的SwiftUI NavigationView问题
我在一个需要具有“一对多”实体结构的模型的项目中使用SwiftUI。我在父级使用导航视图,在父级和子级使用导航链接。
这很有效,因为我可以:
- 在父级选择一个孩子以导航到该孩子
- 在子级别选择一个孙子以导航至该孙子
我还有一个额外的要求-在孙级提供下一个和上一个按钮。我使用为导航链接提供的标记/选择功能来执行此操作。我给每个孙子孙一个数字索引标签,然后调用子级传入的函数,通过在索引中添加或减去一个来更改所选的子视图。
问题在于,当我导航到下一个或上一个孙子时,“后退”链接将更改为访问的最后一个孙子,或者改为“后退”一词,而不是子视图。如果再选择该视图上的“后退”链接,则会立即过渡到以前访问的孙子,然后立即过渡到子视图。
所包含的代码是一个有效的项目,它显示了一个简单的示例,该示例使用具有相同问题的“一对多”方案。
如果我将代码更改为一个更简单的父子模型,并在子级别使用next和previous,则所有这些都按预期工作,因此问题出在三个级别。欢迎提供解决方案的帮助。
//
// ContentView.swift
// NextPreviousTest
//
// Created by Mike Cooper on 26/09/2020.
//
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
Spacer()
NavigationLink(destination: ChildView()) {
Text("Child View")
}.buttonStyle(PlainButtonStyle())
Spacer()
}.navigationBarTitle(Text("Parent"),displayMode: .inline)
}
}
}
struct ChildView: View {
@State private var array = [0,1,2,3,4,5]
@State private var selectedGrandChild: String? = nil
var body: some View {
ScrollView {
ForEach(0..<array.count) { i in
NavigationLink(destination: GrandChildView(viewIndex: self.array[i],prevFunction: childView_prevFunction,nextFunction: childView_nextFunction
),tag: String(self.array[i]),selection: $selectedGrandChild) {
Text("Grandchild \(self.array[i])").padding()
}.buttonStyle(PlainButtonStyle())
}
}.navigationBarTitle(Text("Child"),displayMode: .inline)
}
private func childView_prevFunction() {
let tag = Int(self.selectedGrandChild ?? "0")
if tag! > 0 {
self.selectedGrandChild = String(tag! - 1)
print(String(tag! - 1))
}
}
private func childView_nextFunction() {
let tag = Int(self.selectedGrandChild ?? "0")
if tag! < self.array.count - 1 {
self.selectedGrandChild = String(tag! + 1)
print(String(tag! + 1))
}
}
}
struct GrandChildView: View {
let viewIndex: Int
var prevFunction: () -> Void
var nextFunction: () -> Void
var body: some View {
VStack{
HStack {
Button(action: {
self.prevFunction()
}) {
Image(systemName: "chevron.left")
}
Text("Grandchild \(viewIndex)")
Button(action: {
self.nextFunction()
}) {
Image(systemName: "chevron.right")
}
}.font(.headline)
}.navigationBarTitle("Grandchild \(viewIndex)").font(.caption)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。