如何解决NavigationLink 在返回父视图之前多次推送视图 列表视图锻炼视图EditStepViewWorkoutData数据模型
问题
我有 3 个视图:ListView --> WorkoutView --> EditStepView。
当我从ListView开始,然后导航到WorkoutView,最后点击NavigationLink到EditStepView,EditStepView推了几下,很快就回到了WorkoutView相对安全的状态。为什么会发生这种情况?
Click here to see a gif of the error
我尝试过的
我已经尝试过 this 和 this,但到目前为止都没有成功。虽然我认为第一个可能会有所作为。
我注意到如果我在步骤中只保存了 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")
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。