Метод без наблюдаемого объекта

#ios14 #swiftui-environment

#ios14 #swiftui-среда

Вопрос:

У меня есть метод класса, который, по-видимому, не видит объект @EnvironmentObject var categories: Categories в верхней части класса. Я знаю, что это работает, так как я использую его в нескольких других файлах. Это также означает, что мое кодирование в SceneDelegate является правильным. Сбой программного обеспечения с ошибкой: Поток 1: Неустранимая ошибка: не найден ObservableObject категорий типов. View.environmentObject(_:) для категорий может отсутствовать как предок этого представления. Ошибка возникает в методе updateTotals() в цикле «for»

 struct CatItem:  Codable, Identifiable {
    var id = UUID()
    var catNum: Int
    var catName: String  <-- this is the class I'm trying to reference
    var catTotal: Double   
    var catPix: String   
    var catShow: Bool
}

    class Categories: ObservableObject {
        
        @Published var catItem: [CatItem] 
           
        }




class BaseCurrency: ObservableObject {
    
    @EnvironmentObject var userData: UserData
    @EnvironmentObject var categories: Categories
    
    var foundNew: Bool = false 
    var newRate: Double = 0.0
    
    var baseCur: BaseModel
    
    
    //-----------------------------------------------------
    // new base currency so need to update the system totals
    //-----------------------------------------------------
    func updateTotals() -> () {
        
        for index in 0...(categories.catItem.count - 1) {      <-- error here
            categories.catItem[index].catTotal *= self.newRate
        }
        
        userData.totalArray[grandTotal] *= self.newRate
        userData.totalArray[transTotal] *= self.newRate
        userData.totalArray[userTotal] *= self.newRate
        
        let encoder = JSONEncoder()
        if let encoded = try? encoder.encode(self.baseCur) {
            UserDefaults.standard.set(encoded, forKey: "base")
        }
   
        self.foundNew = false
    }
}
 

Ответ №1:

Я где-то недавно читал, что @EnvironmentObject похож на @State в том смысле, что изменение любого параметра приведет к тому, что body обновит представление. Поэтому ни один из них не должен быть в классе. Я реорганизовал свое программное обеспечение и с тех пор не видел ошибки.