【问题标题】:How to get data from the Model and update it如何从模型中获取数据并更新它
【发布时间】:2020-07-05 22:20:47
【问题描述】:

我有一个数据模型,我想在各种视图中使用它的数据。因此,首先我在从我的数据模型中轮询该信息时遇到问题,其次我在更新数据时遇到问题。 这是我的数据模型的一个示例,它具有三个视图。

数据模型

// A basic resocrd of each exercise in a workout
class WorkoutItem:ObservableObject, Identifiable{
    
    var id:Int = 0
    var name: String = "An Exercise"
    var sets:Int = 3
    var reps:Int = 10
    
    func addSet() {
        sets += 1
    }
    init(){
        
    }
    
}

// The model for holding a workout
class WorkoutModel:ObservableObject{
    @Published var workout:[WorkoutItem] =  []
    var lastID:Int = -1
    
    /// Creates a newID based on the last known ID
    private func newId()->Int{
        lastID += 1
        return lastID
    }
    
    func add(name:String, sets:Int, reps:Int){
        let newExercise = WorkoutItem()
        
        workout += [newExercise]
    }
    
    
    init() {
        add(name: "Psuh Pp", sets: 1, reps: 8)
        add(name: "Pull UPs", sets: 1, reps: 10)
    }
}

查看 1

struct ContentView: View {
    @ObservedObject var myWorkout: WorkoutModel
    var body: some View {
        List(self.myWorkout.workout) { item in
            VStack(alignment: .leading) {
                VStack(alignment: .leading) {
                    Text(item.name).font(.headline)
                    ExerciseEntryView(exItem: item)
                }
            }
        }
    }
}

查看 2

struct ExerciseEntryView: View {
    var exItem: WorkoutItem
    var body: some View {
        VStack {
            VStack(alignment: .leading){
                
                ForEach(0 ..< exItem.sets, id: \.self){ row in
                    ExerciseEntryView_Row(setNumber: row)
                }
                
            }
            Button(action: {
                self.exItem.addSet()
            }) {
                Text("Add Set").foregroundColor(Color.red)
            }
        }
    }
}

查看 3

struct ExerciseEntryView_Row: View {
    var setNumber: Int
    var body: some View {
        HStack{
            Text("Set Number \(setNumber)")
        }
    }
}

首先在运行代码时,如下图所示,标题仍然是默认值(“练习”),而它应该是Pull upPush up。此外,当我按下add set 时,该集合会在终端中更新,但不会更新视图。

知道为什么这不起作用吗?

提前致谢。

【问题讨论】:

    标签: swift swiftui observable data-modeling swift5


    【解决方案1】:

    首先你可以让你的WorkoutItem 成为一个结构

    struct WorkoutItem: Identifiable {
        var id: Int = 0
        var name: String = "An Exercise"
        var sets: Int = 3
        var reps: Int = 10
    
        mutating func addSet() {
            sets += 1
        }
    }
    

    然后在WorkoutModel 中,您没有为新练习设置任何属性:

    class WorkoutModel: ObservableObject {
        ...
        func add(name: String, sets: Int, reps: Int) {
            var newExercise = WorkoutItem()
            newExercise.name = name // <- set properties
            newExercise.sets = sets
            newExercise.reps = reps
    
            workout += [newExercise]
        }
    
        init() {
            add(name: "Push Pp", sets: 1, reps: 8)
            add(name: "Pull UPs", sets: 1, reps: 10)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 2021-09-19
      • 2020-10-20
      • 1970-01-01
      • 2021-05-02
      • 2017-08-20
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多