我已经构建了一个原始测验应用程序。有ContentView
一个navigationlink
问题。从问题一的观点来看(这是一个叫做 questionOne 的观点),我有一个问题和另一个navigationlink
要 questionTwo 的观点。它一直持续到最后一个问题,在最后一个问题(有 194 个问题)中,有一个指向结果视图的导航链接。因为一切都是这样硬编码的,所以问题的顺序总是相同的。
我想知道的是,如何将194道题的顺序随机化,每道题都答完后,进入最后的结果视图。
我有限的知识表明我应该创建一个视图数组并在导航链接中使用该数组,但我不知道如何实现它。即使我可以实现它,我也不知道如何不一次显示两次相同的问题并在最后到达结果页面。
这是我的代码示例:
这是主页:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
Text("Capitals of the World Trivia").font(.title)
.fontWeight(.bold)
NavigationLink(destination: questionOne()) {
logoView()
}.buttonStyle(PlainButtonStyle()).padding()
Text("Tap the globe to continue")
}
}
}
}
这是一个问题视图:
var score = 0
// I have a global variable for score,
struct questionOne: View {
@State var counter = 0
@State var isSelected = false
func onClick() {
counter += 1
if counter == 1 { score += 1}
else if counter > 1 { score += 0}
}
var body: some View {
GeometryReader { GeometryProxy in
VStack (alignment: .center) {
Q1Prague().cornerRadius(10)
Spacer()
Text(verbatim: "What's the capital of Czech Republic?")
.font(.title)
.frame(width: 350, height: 80)
Button(action: {self.isSelected.toggle()}) {
Text("Novigrad")
}.buttonStyle(SelectedButtonStyleFalse(isSelected: self.$isSelected))
Spacer()
Button(action: {self.onClick();self.isSelected.toggle()}) {
Text("Prague")
}.buttonStyle(SelectedButtonStyle(isSelected: self.$isSelected))
Spacer()
Button(action: {self.isSelected.toggle()}) {
Text("Ostrava")
} .buttonStyle(SelectedButtonStyleFalse(isSelected: self.$isSelected))
Spacer()
VStack {
HStack {
NavigationLink(destination: questionTwo()) {
Text("Next Question")
}
}
AdView().frame(width: 150, height: 60)
}
}
}.padding(.top, 80).edgesIgnoringSafeArea(.top)
}
}
这是我的最后一个问题:
struct question194: View {
@State var counter = 0
@State var isSelected = false
func onClick() {
counter += 1
if counter == 1 { score += 1}
else if counter > 1 { score += 0}
}
var body: some View {
GeometryReader { GeometryProxy in
VStack (alignment: .center) {
Q194Athens().cornerRadius(10)
Spacer()
Text(verbatim: "What's the capital of Greece?")
.font(.title)
.frame(width: 400, height: 80)
Button(action: {self.onClick();self.isSelected.toggle()}) {
Text("Athens")
}.buttonStyle(SelectedButtonStyle(isSelected: self.$isSelected))
Spacer()
Button(action: {self.isSelected.toggle()}) {
Text("Sparta")
}.buttonStyle(SelectedButtonStyleFalse(isSelected: self.$isSelected))
Spacer()
Button(action: {self.isSelected.toggle()}) {
Text("Ostrava")
} .buttonStyle(SelectedButtonStyleFalse(isSelected: self.$isSelected))
Spacer()
VStack {
HStack {
NavigationLink(destination: ResultPage()) {
Text("Next Question")
}
}
AdView().frame(width: 150, height: 60)
}
}
}.padding(.top, 80).edgesIgnoringSafeArea(.top)
}
}