【问题标题】:My ObservableObject Class Array Variable 'timeStep' Fails To Hold Values我的 ObservableObject 类数组变量“timeStep”无法保存值
【发布时间】:2021-06-03 15:02:02
【问题描述】:

我有两个 ObservableObject 类:CarLotData 和 StopWatchManager。我想要做的是使用我的 StopWatchManager 类来加载 CarLotData 属性 timeStep——这是一个数组 Double 类型。

这是我的 StopWatchManager 代码:

import Foundation
import SwiftUI

class StopWatchManager: ObservableObject {
    
@ObservedObject var carLotData = CarLotData()

var timer = Timer()
    
@Published var mode: stopWatchMode = .stopped
@Published var secondsElapsed = 0.0
  
enum stopWatchMode {
case running
case stopped
case paused
}
    
func start() {

            
mode = .running
timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
self.secondsElapsed = self.secondsElapsed + 0.1
}
        
}
func stop() {
        
          
timer.invalidate()
          
        
if carLotData.timeStep.count < 7 {
carLotData.timeStep.append(secondsElapsed)
print(carLotData.timeStep)
mode = .stopped
           
}
          
          
}
         
}
    

这是我的 CarLotData 代码:

import SwiftUI
import Foundation

class CarLotData: ObservableObject {


@Published var carLotData: Int = 0

@Published var carStep: [Double] = []




var id = UUID()
var newUsed: Int = 0
var powerType: Int = 0
var downPayment: Int = 0
var salesmanType: Int = 0
var appointment: Int = 0
var internet: Int = 0
var retail: Int = 0
var carType: Int = 0
var carBrand:  Int = 0
var purchaseType: Int = 0
var creditRank: Int = 0
var warranty: Int = 0
var service: Int = 0
var thirdParty: Int = 0
var timeStep: [Double] = []
var salesman: Int = 0   
}

最后是我的观点,我在其中得到“timeStep = []”,我想要一个 Double 值数组。

import SwiftUI

struct CarLotDataView: View {

@ObservedObject var carLotData = CarLotData()
@ObservedObject var stopWachManager = StopWatchManager()

var body: some View {
    
    
List {

Group {


Text("Customer ID: \(carLotData.id)")
Text("Salesman: \(carLotData.salesman)")
Text("New/Used: \(carLotData.newUsed)")
Text("Power Type: \(carLotData.powerType)")
Text("Down Payment: \(carLotData.downPayment)")
Text("Salesman Type: \(carLotData.salesmanType)")
Text("Appointment: \(carLotData.appointment)")
}

Group {

Text("Internet: \(carLotData.internet)")
Text("Retail: \(carLotData.retail)")
Text("Car Type: \(carLotData.carType)")
Text("Car Brand: \(carLotData.carBrand)")
Text("Purchase Type: \(carLotData.purchaseType)")
Text("Credit Rankd: \(carLotData.creditRank)")
Text("Warranty: \(carLotData.warranty)")
Text("Service: \(carLotData.service)")
Text("Third Party: \(carLotData.thirdParty)")
Text("Time Steps: \(carLotData.timeStep)" as String)

}

}
    
}
}

其他一切正常,只是我的计时器的值没有转移到我的 timeStep 数组中。任何见解将不胜感激。

【问题讨论】:

    标签: swift swiftui observableobject observedobject


    【解决方案1】:

    您正在尝试从 StopWatchManager 访问和更新 CarLotData 并且您正在这样做,但是您在视图中完全使用了另一个,您必须使用同一个你更新了!

    诀窍是始终使用您开始时的同一个参考!

    将此行添加到您的 CarLotData

    static let shared: CarLotData = CarLotData()
    

    然后在 StopWatchManager 上使用此代码:

    let carLotData = CarLotData.shared
    

    不要在 Class 中使用@ObservedObject,使用 let 就可以了。


    最后在你的视图中使用这个:

    @ObservedObject var carLotData = CarLotData.shared
    

    对于我的个人应用,我会使用以下代码:

    @StateObject var carLotData = CarLotData.shared
    

    【讨论】:

    • 值得一提的是StopWatchManagerObservableObject,而不是View。所以在那里使用@ObservedObject 是没有意义的。
    • 我不想重构代码,只是想让代码像 OP 编码一样工作,谢谢。
    • 完全按预期工作。您提到使用 @StateObject var carLotData = CarLotData.shared “向下代码”。参考不清楚,我根本没有使用过 StateObject。如果您能对此进行扩展,我将不胜感激。再次感谢。
    • 正如我所说的,但你可以使用你喜欢的那个,我的原因是这个,因为那个 View 将是你的应用程序和模型的主界面,我想使用 StateObject 而不是 ObservedObject,苹果说,在我们可以使用 StateObject 的地方,它比 ObservedObject 更好用,ObservedObject 以疯狂的方式控制和读取数据源,我想说的比 StateObject 所做的要多得多,因此 StateObject 更好。也许还有其他一些事情,但我告诉了你重要的事情。
    • 谢谢,您的反馈非常有帮助。
    【解决方案2】:

    您正在创建 CarLotData 两次。正确的方法是确保您访问正确的参考。

    另一种方法是使 CarLotData 成为单例。但是,如果您要在多个视图中使用这些数据,这才是正确的方法。

    class CarLotData: ObservableObject {
      static public let shared = CarLotData()
      private init() { }
    }
    

    然后你会像这样使用它。确保永远不要调用 CarLotData()

    Text("Internet: \(CarLotData.shared.internet)")
    

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 2020-05-31
      • 2010-10-09
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多