0

I want tu update main NavigationView after dismissing subview from NavigationLink, but from one subview with Success and from another with "EXC_BAD_ACCESS (code=2..." in XCode.

I do it by @Binding var which I change its value from subview. I think, the problems are related to CoreData, but I dont know where and why.

Any idea?

MainView:

struct ProgramView: View {
@State var preliminaryViewed: Bool = Program2s.shared.program2s.preliminaryViewed
@State var programs = ProgramStatess.shared.programStats
@State var states: [Int] = [0, 0, 0, 0]

func programState(number: Int){
        if programs[number].startDate != nil {
            if programs[number].completed {
                states[number] = 2
            }
            else{
                states[number] = 1
            }
        }
        else{
            states[number] = 0
        }

}

var body: some View {
    NavigationView {
        VStack(alignment: .leading){
            ForEach(programs, id: \.self){ program in
                Group {
                    NavigationLink(destination:
                    {
                        VStack{
                            if program.order == 0 {
                                if self.states[Int(program.order)] == 1 {
                                    Program1View(state: self.$states[Int(program.order)])
                                        .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                }
                                else {
                                    Program1ResultView()
                                        .navigationBarTitle(Text("\(program.name!)(Splněno) - shrnutí"), displayMode: .inline)
                                }
                            }
                            else if program.order == 1 {
                                if self.states[Int(program.order)]  == 1 {
                                    if !self.preliminaryViewed {
                                        AnyView(Program2PreliminaryView(preliminaryViewed: self.$preliminaryViewed))
                                            .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                    }
                                    else {
                                        AnyView(Program2View(state: self.$states[Int(program.order)]))
                                            .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                    }
                                }
                                else{
                                    AnyView(Program2View(state: self.$states[Int(program.order)]))
                                        .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                }
                            }
                            else {
                                if self.states[Int(program.order)] == 1 {
                                    AnyView(Program1View(state: self.$states[Int(program.order)]))
                                        .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                }
                                else{
                                    AnyView(Program1View(state: self.$states[Int(program.order)]))
                                        .navigationBarTitle(Text("\(program.name!)"), displayMode: .inline)
                                }
                            }
                        } // end of VStack
                    }() 

                    ) {
                        VStack(alignment: .leading){
                            if self.states[Int(program.order)] == 0 {
                                Text("\(program.name!)")
                                    .fontWeight(.bold).font(.headline)
                                Divider()
                                Text("Closed")
                            }
                            else if self.states[Int(program.order)] == 1 {
                                Text("\(program.name!)")
                                    .fontWeight(.bold).font(.headline)
                                    .foregroundColor(Color(.systemYellow))
                                Divider()
                                Text("Opened")
                            }
                            else {
                                Text("\(program.name!)")
                                    .fontWeight(.bold).font(.headline)
                                    .foregroundColor(Color(UIColor.systemGray))
                                Divider()
                                Text("Finished")
                            }

                        }
                        .padding()
                    } // end of navlink
                    .buttonStyle(PlainButtonStyle())
                    .disabled(self.states[Int(program.order)] == 0)
                    Spacer()
                } // end of group
            } // end of foreach

        } // end of VStack
        .padding()
        .navigationBarTitle("Program")
        .onAppear(){
            for value in 0...3 {
                print("self.states[\(value)]=\(self.states[value])")
            }
        }
    } // end of Navigationview
    .onAppear(perform: {
        self.changeColor()
        for value in 0...3 {
            self.programState(number: value)
        }
    })
}

SubView with Success after change "self.state = 2"

struct Program2View: View {
@Binding var state: Int
@State private var page: Int = 0
@State private var disableSwipe: Bool = false
@State private var pages: Int = 7
@State var progressValue: Float = 1.0/7.0
@State var progressChange: Float = 1.0/7.0
@State var showingAlert: Bool = false
@Environment(\.presentationMode) var presentationMode
let program2 = Program2s.shared
let programStates = ProgramStatess.shared
@ObservedObject var stopWatch = StopWatch()

var body: some View {
    ZStack{
        VStack{
        ProgressBar(value: $progressValue).frame(height: 20)
            .padding()
        PageView([
            AnyView(
                VStack{
                        Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Text("Bla bla bla.")
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{
                    Spacer()
                    Text("Bla bla bla.")
                        .fixedSize(horizontal: false, vertical: true)
                        .padding(.bottom)
                    Text("Bla bla bla.")
                    Spacer()
                }
                .padding()
                .onAppear(){
                   self.progressValue = Float(self.page+1)*self.progressChange
                }
            )
        ], currentPage: $page, disableSwipe: $disableSwipe)
        } // end of VStack
        VStack{
            Spacer()
            HStack{
                Spacer()
                if (page-1 > -1 ){
                    Button(action: ({ 
                        self.page=self.page-1
                    })){
                        Image(systemName: "arrow.left")
                            .foregroundColor(Color(.systemGray))
                            .padding()
                    }
                }
                if (page+1 < pages ){
                    Button(action: ({
                        self.page=self.page+1
                    })){
                        Text("Continue")
                    }
                }
                if (page == 6 ){
                    Button(action: ({
                        if self.program2.program2s.programCompleted == nil {
                            self.showingAlert = true
                            self.stopWatch.pause()
                        }
                        else {
                            self.presentationMode.wrappedValue.dismiss()
                        }
                    })){
                        Text("Finish")
                    }
                }
            } // end of HStack
        } //end of VStack
        .padding()
    } // end of ZStack
    .alert(isPresented: $showingAlert, content:{
       Alert(title: Text("Bla bla bla"),
           message: Text("Bla bla bla"),
           primaryButton: .default(Text("Continue")) {
                if self.program2.program2s.programCompleted == nil{
                    self.program2.setProgram2(relaxDurationInSec: Double(self.stopWatch.stopWatchSeconds))
                    self.programStates.setProgramStateCompleted(program: 2)
                }
                self.state = 2 // HERE IT IS
                self.presentationMode.wrappedValue.dismiss()
            },
           secondaryButton: .cancel(Text("Back"))
        )
    })
    .onAppear(){
        // START STOPWATCH
        if self.program2.program2s.programCompleted == nil {
            if self.stopWatch.stopWatchSeconds == 0 {
                self.stopWatch.start()
            }
        }
    }
    .onDisappear(){
        // STOP STOPWATCH
        if !self.stopWatch.isPaused() {
            self.stopWatch.pause()
            self.stopWatch.reset()
        }
    }
}

SubView with ERROR after change "self.state = 2"

struct Program1View: View {
@Binding var state: Int
@EnvironmentObject var sliderData: SliderData
@State private var page: Int = 0
@State private var disableSwipe: Bool = true
@State private var pages: Int = 6
@State var progressValue: Float = 1.0/6.0
@State var progressChange: Float = 1.0/6.0
@State var showingAlert: Bool = false
@State var target: String = ""
@State var target_saveChangesInstantly: Bool = false
@State var completion: String = ""
@State var completion_saveChangesInstantly: Bool = false
@State var satisfiability: Float = 0
@State var reason: String = ""
@State var reason_saveChangesInstantly: Bool = false
@State var deadline: String = ""
@State var deadline_saveChangesInstantly: Bool = false
@State var summarizedTarget: String = ""
@State var summarizedTarget2: String = ""
@Environment(\.presentationMode) var presentationMode
let program1 = Program1s.shared
let programStates = ProgramStatess.shared


var nextIsDisabled: Bool {
    switch self.page {
        case 0 : do {
            return target == "" ? true : false
        }
        case 1: do {
            return completion == "" ? true : false
            }
        case 2: do {
            return satisfiability < 6.0 ? true : false
        }
        case 3: do {
            return reason == "" ? true : false
        }
        case 4: do {
            return deadline == "" ? true : false
        }
        case 5: do {
            return summarizedTarget == "" ? true : false
        }
        default: do {
            return true
        }
    }
}

var nextButtonColor: Color {
    return nextIsDisabled ? Color(.systemGray) : app_green
}

var submitButtonColor: Color {
    return summarizedTarget == "" ? Color(.systemGray) : app_green
}

var body: some View {
    ZStack {
        VStack {
        ProgressBar(value: $progressValue).frame(height: 20)
            .padding()
        PageView([
            AnyView(
                VStack{ // Slide 1
                    HStack{
                        Text("Blablabla")
                        Spacer()
                    }
                    HStack{
                        MultilineTextView(text: $target, text_saveChangesInstantly: $target_saveChangesInstantly)
                }
                .keyboardAdaptive(posun: 245)
                .padding()
                .onAppear(){
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView(
                VStack{ // Slide 2
                    HStack{
                        Text("Blablabla")
                        Spacer()
                    }
                    HStack{
                        MultilineTextView(text: $completion, text_saveChangesInstantly: $completion_saveChangesInstantly)
                    }
                }
                .keyboardAdaptive(posun: 245)
                .padding()
                .onAppear(){
                    if self.target == "" {
                        self.page = 0
                    }
                    self.progressValue = Float(self.page+1)*self.progressChange
                 }
            ),
            AnyView( // Slide 3
                VStack(spacing: 50){
                    HStack{
                        Text("Blablabla")
                        Spacer()
                    }
                    VStack{
                        HStack{
                            Slider(value: $sliderData.sliderValue, in: 1...10, step: 1, onEditingChanged: { (changed) in
                                // Editing Changed
                                self.satisfiability = self.sliderData.sliderValue
                            })
                            .accentColor(Color(.systemYellow))
                        }
                        HStack(){
                            ForEach(1 ..< 11) { number in
                                Text("\(number)")
                                    .frame(maxWidth: .infinity)
                                    .onTapGesture {
                                        self.satisfiability = Float(number)
                                        self.sliderData.sliderValue = Float(number)
                                }
                            }
                        }
                    }
                    HStack{
                        if self.satisfiability > 0.0 && self.satisfiability < 6.0 {
                            Text("Blablabla")
                        }
                        Spacer()
                    }
                    Spacer()
                } // end of VStack
                .padding()
                .onAppear(){
                    if self.completion == "" {
                        self.page = 1
                    }
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView( // Slide 4
                VStack{
                    HStack{
                        Text("Blablabla")
                        Spacer()
                    }
                    HStack{
                        MultilineTextView(text: $reason, text_saveChangesInstantly: $reason_saveChangesInstantly)
                    }
                }
                .keyboardAdaptive(posun: 245)
                .padding()
                .onAppear(){
                    if self.satisfiability < 6.0 {
                        self.page = 2
                    }
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView( // Slide 5
                VStack{
                    HStack(alignment: .firstTextBaseline){
                        Text("Blablabla")
                        Spacer()
                    }
                    HStack{
                        MultilineTextView(text: $deadline, text_saveChangesInstantly: $deadline_saveChangesInstantly)
                    }
                }
                .keyboardAdaptive(posun: 245)
                .padding()
                .onAppear(){
                    if self.reason == "" {
                        self.page = 3
                    }
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            ),
            AnyView( // Slide 6 - final
                ScrollView{
                    VStack{
                        HStack{
                            Text("1.Blablabla")
                            Spacer()
                        }
                        HStack{
                            Text("\(target)")
                            Spacer()
                        }
                    }.padding(.leading).padding(.bottom)
                    VStack{
                        HStack{
                            Text("2.Blablabla")
                            Spacer()
                        }
                        HStack{
                            Text("\(completion)")
                            Spacer()
                        }
                    }.padding(.leading).padding(.bottom)
                    VStack{
                        HStack{
                            Text("3. Blablabla")
                            Spacer()
                        }
                        HStack{
                            Text("\(satisfiability, specifier: "%.0f") / 10")
                            Spacer()
                        }
                    }.padding(.leading).padding(.bottom)
                    VStack{
                        HStack{
                            Text("4. Blablabla")
                            Spacer()
                        }
                        HStack{
                            Text("\(reason)")
                            Spacer()
                        }
                    }.padding(.leading).padding(.bottom)
                    VStack{
                        HStack{
                            Text("5. Blablabla")
                            Spacer()
                        }
                        HStack{
                            Text("\(deadline)")
                            Spacer()
                        }
                    }.padding(.leading).padding(.bottom)
                    VStack{
                        HStack{
                            Text("Blablabla")
                            Spacer()
                        }
                        HStack{
                            TextField("Blablabla" text: $summarizedTarget2, onEditingChanged: { (changed) in
                                // Editing Changed
                                if self.summarizedTarget2.count > 69 {
                                    self.summarizedTarget2=String(self.summarizedTarget2.prefix(69))
                                }
                            }) {
                                //Editing Commited
                                self.summarizedTarget = self.summarizedTarget2
                            }
                            .textFieldStyle(RoundedBorderTextFieldStyle())
                            Spacer()
                        }
                    }.padding()
                } // end of Scrollview
                .keyboardAdaptive(posun: 120)
                .onAppear(){
                    if self.deadline == "" {
                        self.page = 4
                    }
                    self.progressValue = Float(self.page+1)*self.progressChange
                }
            )
        ], currentPage: $page, disableSwipe: $disableSwipe)
        } // end of VStack
        VStack{
            Spacer()
            HStack{
                Spacer()
                if (page-1 > -1 ){
                    Button(action: ({ // Button "Back"
                        self.page=self.page-1
                    })){
                        Image(systemName: "arrow.left")
                    }
                }
                if (page+1 < pages ){
                    Button(action: ({
                        self.page=self.page+1
                    })){
                        Text("Continue")
                    }.disabled(nextIsDisabled)
                }
                if (page == 5 ){
                    Button(action: ({
                        self.showingAlert = true
                    })){
                        Text("Finish")
                    }.disabled(summarizedTarget == "")
                }
            } // end of HStack
        } //end of VStack
        .padding()
    } // end of ZStack
    .alert(isPresented: $showingAlert, content:{
       Alert(title: Text("Blablabla"),
           message: Text("Blablabla"),
           primaryButton: .default(Text("Continue")) {
            self.program1.addProgram1(target: self.target, completion: self.completion, satisfiability: self.satisfiability, reason: self.reason, deadline: self.deadline, sumarizedTarget: self.summarizedTarget)
            self.programStates.setProgramStateCompleted(program: 1)
            self.state = 2 // HERE IT IS, Starting problem finished with ERROR
            self.presentationMode.wrappedValue.dismiss()
             },
           secondaryButton: .cancel(Text("Edit"))
        )
    })
} // end of body
joey
  • 1
  • 1
  • Would you provide demo code for this? Crash code means nothing here. – Asperi May 16 '20 at 14:11
  • I don't want to miss anything. Can it be like this? – joey May 16 '20 at 14:52
  • @joey I would open a new project and create a minimal version of the problem. That is, copy over your code and clean out anything that is not about the error, so only code that causes the error will remain. You will find more help on SO this way. Currently you have too much code for most to take the time to review. Good luck. – Bryan Potts May 16 '20 at 18:29
  • Problem is in NavigationLink Destination, after change value in Program1View, Navigation Link destination prepare and immediately Appear Program1ResultView, unnecessary and incomprehensible, and there is problem finished with error. Thus, such use of NavigationLink Destination appears to be unstable. – joey May 20 '20 at 00:27

0 Answers0