I made a small quiz. When you press a button an specific amount is added to Xcode and Ycode. Now I want to take the value of Xcode and Ycode with me to the next view. So when you are in the next view you can answer another question and an amount is added on top of the existing amount and then I want to take that value to yet another view.
So how could I take the value of Xcode and Ycode to the next view? This is de code I made:
@State var ShowButton: Bool = false
@State var ButtonYes: Bool = false
@State var ButtonNo: Bool = false
@State var ButtonSometimes: Bool = false
@State var Xcode = 0
@State var Ycode = 0
var body: some View {
ZStack{
Image("Chimps")
.resizable()
.ignoresSafeArea()
.navigationBarHidden(true)
VStack{
Text("Question 1")
.font(.largeTitle)
.fontWeight(.heavy)
.padding()
.foregroundColor(.white)
.background(Color(red: 0.493, green: 0.184, blue: 0.487))
.cornerRadius(20)
Spacer()
Text(String(Xcode))
Text(String(Ycode))
Text("Question 1")
.foregroundColor(Color.white)
.font(.headline)
.padding()
.background(Color(red: 0.493, green: 0.184, blue: 0.487))
.cornerRadius(20)
Spacer()
Spacer()
HStack(spacing:10) {
Button("Yes") {
ShowButton = true
ButtonYes.toggle()
if ButtonYes == true {
Xcode = 5
}
if ButtonYes == true {
Ycode = 5
}
if ButtonYes == false {
Xcode -= 5
}
if ButtonYes == false {
Ycode -= 5
}
if ButtonNo == true {
Xcode -= 3
}
if ButtonNo == true {
Ycode -= 3
}
if ButtonSometimes == true {
Xcode -= 1
}
if ButtonSometimes == true {
Ycode -= 1
}
if ButtonYes == true {
ButtonNo = false
}
if ButtonYes == true {
ButtonSometimes = false
}
}
.frame(width: 50, height: 50, alignment: .center)
.foregroundColor(.white)
.padding()
.background(ButtonYes ? Color(red: 0.272, green: 0.471, blue: 0.262) : Color(red: 0.493, green: 0.184, blue: 0.487))
.cornerRadius(20)
.shadow(color: .black, radius: 10, x: 10, y: 10)
Button("No") {
ShowButton = true
ButtonNo.toggle()
if ButtonNo == true {
Xcode = 3
}
if ButtonNo == true {
Ycode = 3
}
if ButtonNo == false {
Xcode -= 3
}
if ButtonNo == false {
Ycode -= 3
}
if ButtonYes == true {
Xcode -= 5
}
if ButtonYes == true {
Ycode -= 5
}
if ButtonSometimes == true {
Xcode -= 1
}
if ButtonSometimes == true {
Ycode -= 1
}
if ButtonNo == true {
ButtonYes = false
}
if ButtonNo == true {
ButtonSometimes = false
}
}
.frame(width: 50, height: 50, alignment: .center)
.foregroundColor(.white)
.padding()
.background(ButtonNo ? Color(red: 0.272, green: 0.471, blue: 0.262) : Color(red: 0.493, green: 0.184, blue: 0.487))
.cornerRadius(20)
.shadow(color: .black, radius: 10, x: 10, y: 10)
Button("Sometimes") {
ShowButton = true
ButtonSometimes.toggle()
if ButtonSometimes == true {
Xcode = 1
}
if ButtonSometimes == true {
Ycode = 1
}
if ButtonSometimes == false {
Xcode -= 1
}
if ButtonSometimes == false {
Ycode -= 1
}
if ButtonYes == true {
Xcode -= 5
}
if ButtonYes == true {
Ycode -= 5
}
if ButtonNo == true {
Xcode -= 3
}
if ButtonNo == true {
Ycode -= 3
}
if ButtonSometimes == true {
ButtonYes = false
}
if ButtonSometimes == true {
ButtonNo = false
}
}
.frame(width: 50, height: 50, alignment: .center)
.foregroundColor(.white)
.padding()
.background(ButtonSometimes ? Color(red: 0.272, green: 0.471, blue: 0.262) : Color(red: 0.493, green: 0.184, blue: 0.487))
.cornerRadius(20)
.shadow(color: .black, radius: 10, x: 10, y: 10)
}
Spacer()
if ShowButton {
NavigationLink(
destination: Question2(),
label: {
Rectangle()
.fill(Color(red: 0.493, green: 0.184, blue: 0.487))
.frame(width: 150, height: 80, alignment: .bottom)
.cornerRadius(20)
.padding(10)
.shadow(color: .black, radius: 10, x: 10, y: 10)
.overlay(
Text("Question 2")
.font(.largeTitle)
.foregroundColor(.white)
.shadow(color: .black, radius: 10, x: 10, y: 10)
)}
)
Spacer()
}
}
}
}
}
CodePudding user response:
Here is a quick and working example of how you could use @Binding on the second screen to update the existing amount. But I would recommend you to take a look on the docs and understand when to use @State, @Binding, @ObservedObject, @StateObject, etc.
import SwiftUI
struct FirstView: View {
@State var xValue = 0
@State var yValue = 0
var body: some View {
NavigationView {
VStack {
Text("\(xValue)")
Text("\(yValue)")
Button("add to x") {
xValue = 1
}
Button("add to y") {
yValue = 1
}
Divider()
NavigationLink("next screen", destination: SecondView(xValue: $xValue, yValue: $yValue))
}
}
}
}
struct SecondView: View {
@Binding var xValue: Int
@Binding var yValue: Int
var body: some View {
NavigationView {
VStack {
Text("\(xValue)")
Text("\(yValue)")
Button("add to x") {
xValue = 1
}
Button("add to y") {
yValue = 1
}
}
}
}
}