SwiftUI 无限子视图层次结构和面包屑
SwiftUI Infinite Subview Hierarchy and Breadcrumbs
我想要实现的是创建分层视图。我知道 iOS 根本不喜欢使用面包屑,但我需要从主视图导航到更深的子视图。它们需要嵌套和无限。
您可以在下面的代码和 gif 中看到我到目前为止所做的工作。由于我是初学者开发人员,所以我不确定这是否是实现这种结构的正确方法(无限子视图嵌套在子视图中)。此外,当我在视图中导航回来时,添加的按钮(结构 A)消失了。好像是什么问题?
提前致谢!
code in action gif
import SwiftUI
struct A: View, Identifiable {
@EnvironmentObject var documentB: classB
var id: Int
var text: String
var destinationLink: B?
var body: some View {
NavigationLink(destination: self.destinationLink) {
VStack{
Rectangle()
.frame(width: 35, height:25)
.background(Color.red)
Text("\(text)")
}
}
}
}
struct B: View, Identifiable {
@EnvironmentObject var documentB: classB
@State var arrayA: [A] = []
var id: Int
var text: String
var mainText: String = "Placeholder"
var body: some View {
NavigationView {
VStack {
Spacer()
ForEach(arrayA){ item in
item
}
Spacer()
Button(action: {
let newB = B(id:self.documentB.arrayB.count+1, text:"B \(self.documentB.arrayB.count+1)")
self.documentB.arrayB.append(newB)
self.arrayA.append(A(id:self.arrayA.count+1, text:"AA \(self.arrayA.count+1)", destinationLink: newB))
}) {
Text("Add A \(self.arrayA.count), B Count: \(self.documentB.arrayB.count)")
}
}
.navigationBarTitle(text)
}
}
}
class classB: ObservableObject {
@Published var arrayB: [B] = [B(id:1, text:"MainView")]
}
struct ContentView: View {
@ObservedObject var documentB = classB()
var body: some View {
VStack {
documentB.arrayB[0]
}
.environmentObject(documentB)
}
}
你只需要将NavigationView
移动到ContentView
,因为一个视图层次上只需要一个,所以
struct ContentView: View {
@ObservedObject var documentB = classB()
var body: some View {
NavigationView { // << move it here from B
VStack {
documentB.arrayB[0]
}
}
.environmentObject(documentB)
}
}
我想要实现的是创建分层视图。我知道 iOS 根本不喜欢使用面包屑,但我需要从主视图导航到更深的子视图。它们需要嵌套和无限。
您可以在下面的代码和 gif 中看到我到目前为止所做的工作。由于我是初学者开发人员,所以我不确定这是否是实现这种结构的正确方法(无限子视图嵌套在子视图中)。此外,当我在视图中导航回来时,添加的按钮(结构 A)消失了。好像是什么问题?
提前致谢!
code in action gif
import SwiftUI
struct A: View, Identifiable {
@EnvironmentObject var documentB: classB
var id: Int
var text: String
var destinationLink: B?
var body: some View {
NavigationLink(destination: self.destinationLink) {
VStack{
Rectangle()
.frame(width: 35, height:25)
.background(Color.red)
Text("\(text)")
}
}
}
}
struct B: View, Identifiable {
@EnvironmentObject var documentB: classB
@State var arrayA: [A] = []
var id: Int
var text: String
var mainText: String = "Placeholder"
var body: some View {
NavigationView {
VStack {
Spacer()
ForEach(arrayA){ item in
item
}
Spacer()
Button(action: {
let newB = B(id:self.documentB.arrayB.count+1, text:"B \(self.documentB.arrayB.count+1)")
self.documentB.arrayB.append(newB)
self.arrayA.append(A(id:self.arrayA.count+1, text:"AA \(self.arrayA.count+1)", destinationLink: newB))
}) {
Text("Add A \(self.arrayA.count), B Count: \(self.documentB.arrayB.count)")
}
}
.navigationBarTitle(text)
}
}
}
class classB: ObservableObject {
@Published var arrayB: [B] = [B(id:1, text:"MainView")]
}
struct ContentView: View {
@ObservedObject var documentB = classB()
var body: some View {
VStack {
documentB.arrayB[0]
}
.environmentObject(documentB)
}
}
你只需要将NavigationView
移动到ContentView
,因为一个视图层次上只需要一个,所以
struct ContentView: View {
@ObservedObject var documentB = classB()
var body: some View {
NavigationView { // << move it here from B
VStack {
documentB.arrayB[0]
}
}
.environmentObject(documentB)
}
}