NavigationLink 在返回父视图之前多次推送视图 列表视图锻炼视图EditStepViewWorkoutData数据模型

问题描述

问题

我有 3 个视图:ListView --> WorkoutView --> EditStepView。

当我从ListView开始,然后导航到WorkoutView,最后点击NavigationLink到EditStepView,EditStepView推了几下,很快就回到了WorkoutView相对安全的状态。为什么会发生这种情况?

Click here to see a gif of the error

我尝试过的

我已经尝试过 thisthis,但到目前为止都没有成功。虽然我认为第一个可能会有所作为。

我注意到如果我在步骤中只保存了 2 个字符串,错误就会消失(请参阅数据模型)。一旦我向步骤添加第三个字符串,就会发生错误

我怀疑 ForEach 无法识别它绑定到哪个字符串,因此我需要找到一种方法来识别每个字符串或更改数据模型(我还不知道如何执行此操作)。

感谢您抽出宝贵时间!


列表视图

struct ListView: View {
    var workouts: [WorkoutData]
    var body: some View {
        List {
            ForEach(workouts) { workout in
                NavigationLink(destination: WorkoutView(workout: workout)) {
                    WorkoutCardView(workout: workout)
                }
            }
        }
        .listStyle(InsetGroupedListStyle())
    }
}

锻炼视图

struct WorkoutView: View {
    var workout: WorkoutData
    var body: some View {
        List {
            ForEach(workout.steps,id: \.self) { workout in
                NavigationLink(destination: EditStepView()) {
                    Text(workout)
                }
            }
        }
        .listStyle(InsetGroupedListStyle())
    }
}

EditStepView

struct EditStepView: View {
    var body: some View {
        Form {
            // A form,does not yet accept data
        }
        .navigationTitle("Edit Step")
    }
}

WorkoutData(数据模型)

struct WorkoutData: Identifiable {
    let id: UUID
    var title: String
    var steps: [String]   //an array containing a string

    init(id: UUID = UUID(),title: String,steps: [String]) {
        self.id = id
        self.title = title
        self.steps = steps
    }
}

extension WorkoutData {
    static var data: [WorkoutData] {
        [   WorkoutData(title: "2 On 3 Off",steps: [  
                                   //    Test data
                                                   "Run hard for 2 minutes","Jog for 3 minutes","Run hard for 2 minutes",]),WorkoutData(title: "10 x 400m",steps: [""]),WorkoutData(title: "4-1 Ladder",WorkoutData(title: "5 Minute Repeats",]
    }
}

解决方法

已解决的问题

型号

struct WorkoutData: Identifiable {
    let id: UUID
    var title: String
    var steps: [Steps]   //an array containing a string
    
    init(id: UUID = UUID(),title: String,steps: [Steps]) {
        self.id = id
        self.title = title
        self.steps = steps
    }
}

struct Steps: Identifiable  {
    var id: UUID
    var step : String
    
    init(id: UUID = UUID(),step: String) {
        self.id = id
        self.step = step
    }
}

extension WorkoutData {
    static var data: [WorkoutData] {
        [WorkoutData(title: "2 On 3 Off",steps: [.init(step: "Run hard for 2 minutes"),.init(step: "Jog for 3 minutes"),.init(step: "Run hard for 2 minutes"),.init(step: "Jog for 3 minutes")]),WorkoutData(title: "10 x 400m",steps: [.init(step: "")]),WorkoutData(title: "4-1 Ladder",WorkoutData(title: "5 Minute Repeats",steps: [.init(step: "")])]
    }
}

列表视图

struct ListView: View {
    var body: some View {
        NavigationView{
            List {
                ForEach(WorkoutData.data,id: \.id) { workout in
                    NavigationLink(destination: WorkoutView(workout: workout)) {
                        WorkoutCardView(workout: workout)
                    }
                }
            }
            .listStyle(InsetGroupedListStyle())
        }
    }
}

锻炼视图

struct WorkoutView: View {
    var workout: WorkoutData
    var body: some View {
        List {
            ForEach(workout.steps,id: \.id) { workout in
                NavigationLink(destination: EditStepView()) {
                    Text(workout.step)
                }
            }
        }
        .listStyle(InsetGroupedListStyle())
    }
}

EditStepView

struct EditStepView: View {
    var body: some View {
           Form {
               // A form,does not yet accept data
           }
           .navigationTitle("Edit Step")
       }
}