swiftui - SwiftUI NavigationView 在尝试孙子上一个下一个导航时出现父-子-孙场景问题
问题描述
我在一个需要具有“一对多”实体结构的模型的项目中使用 SwiftUI。我在父级使用导航视图,在父级和子级使用导航链接。
这很好用,因为我可以:
- 在父级选择一个子级以导航到该子级
- 在子级选择孙子以导航到孙子
我有一个额外的要求 - 在孙子级别提供下一个和上一个按钮。我使用为导航链接提供的标签/选择功能来做到这一点。我给每个孙子一个数字索引标签,然后在子级别调用传入的函数,以通过从索引中添加或减去一个来更改选定的子视图。
问题是当我导航到下一个或上一个孙子时,“后退”链接会更改为最后一次访问的孙子,或者是“返回”而不是子视图。如果然后我在该视图上选择“返回”链接,则会立即转换到以前访问过的孙子视图,然后立即转换到子视图。
包含的代码是一个工作项目,它使用具有相同问题的“一对一”场景显示了一个更简单的示例。
如果我将代码更改为更简单的父子模型,在子级别具有下一个和上一个,这一切都按预期工作,所以问题是由于三个级别造成的。非常欢迎任何有关解决方案的帮助。
//
// 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)
}
}
解决方案
推荐阅读
- angular - Angular如何修补表单数组中的值
- java - C# 中的 BigInteger.intValue() 等价物
- python - 如何使用python发送电子邮件
- swift - 是什么导致此代码中出现“EXC_Bad_Instruction”错误?
- angular - 理解 Angular RouterLink 选择器规范中的 ":not" 语法
- angular - TypeError:无法从 kendo 库组件中设置未定义的属性“forceExpand”
- sql - 在sql中搜索RFID的最快方法
- python - ModuleNotFoundError:没有在同一个文件夹项目中命名的模块
- xamarin - 从 Gstreaming 到 VLC 的 udp 流式传输不起作用
- python - pyautogui 在知道 2 个角的特定区域创建屏幕截图