Home > OS >  value being constant in swiftUI
value being constant in swiftUI

Time:02-02

I am sorry im not sure that the title makes sense but if u read, im sure u will understand my problem. I have declared a variable @State var timetext: Int32 in the file CreatingWorkout, with a textfield TextField("5000, 100 etc", value: $timetext, formatter: NumberFormatter()) When i go to the createWorkoutView file and try to present it with the sheet, it wants me to give a value to timetext. However, when i provide a value with the textfield it stays constantly value given when calling with the sheet. I will attach a video here for you to see.

CreatingWorkout.swift :

struct CreatingWorkout: View {
@State var workoutTitle: String
@State var desc: String
@State var timetext: Int32
@State private var iconColor = Color.black
@State var displayWorkout: String = ""
@Environment(\.dismiss) var dismiss
@Environment(\.managedObjectContext) private var viewContext

private func saveWorkout() {
    do {
        let workout = Workout(context: viewContext)
        workout.title = workoutTitle
        workout.time = timetext
        workout.icon = displayWorkout
        workout.descriptionn = desc
        try viewContext.save()
    } catch {
        print(error.localizedDescription)
    }
}

CreateWorkout.swift :

import SwiftUI

struct CreateWorkoutView: View {
    @State private var showingCreateWorkout = false
    @State var timetext: Int32 = 0
    
    var body: some View {
        NavigationView {
            VStack {
                
                VStack(alignment: .center, spacing: 20) {
                    Text("Fitzy")
                        .font(.largeTitle)
                        .fontWeight(.bold)
                    Text("Create your first Workout")
                        .font(.title3)
                        .foregroundColor(.gray)
                    Button {
                        
                        showingCreateWorkout.toggle()
                    } label: {
                        Image(systemName: "plus")
                            .font(.largeTitle)
                            .foregroundColor(.white)
                            .padding()
                            .background(
                                RoundedRectangle(cornerRadius: 10, style: .continuous)
                                    .foregroundColor(Color("AccentColor"))
                                    .frame(width: 50, height: 50)
                            )
                    }.sheet(isPresented: $showingCreateWorkout) {
                        CreatingWorkout(workoutTitle: "", desc: "", timetext: timetext)
                    }
                }
            }.navigationTitle("Create Workout")
        }
    }
}

struct CreateWorkoutView_Previews: PreviewProvider {
    static var previews: some View {
        CreateWorkoutView()
    }
}


https://drive.google.com/file/d/1qQDQmap5bMz9LxzibV98epHW5urqUtZ7/view?usp=sharing

CodePudding user response:

as mentioned in the comments, you need a @State property to pass the value that you type in your TextField to the sheet with CreatingWorkout. Try something like this:

struct CreatingWorkout: View {
    @State var workoutTitle: String
    @State var desc: String
    @State var timetext: Int32
    // ....

    var body: some View {
        Text("\(timetext)")
    }
}

struct CreateWorkout: View {
    @State var showingCreateWorkout = false
    @State var timetext: Int32 = 0  // <-- here
    
    var body: some View {
        VStack {
            TextField("type a number", value: $timetext, format: .number).border(.red) // <-- here
            Button {
                showingCreateWorkout.toggle()
            } label: {
                Image(systemName: "plus").font(.largeTitle).foregroundColor(.red).padding()
                    .background(
                        RoundedRectangle(cornerRadius: 10, style: .continuous)
                            .foregroundColor(Color("AccentColor"))
                            .frame(width: 50, height: 50)
                    )
            }.sheet(isPresented: $showingCreateWorkout) {
                CreatingWorkout(workoutTitle: "", desc: "", timetext: timetext) // <-- here
            }
        }
    }
}
  •  Tags:  
  • Related