【问题标题】:Swift fails to add another environment viewSwift 无法添加另一个环境视图
【发布时间】:2021-09-24 02:20:58
【问题描述】:

我有一个运行良好的环境对象,但后来我添加了另一个,当我放最后一点时,它给了我一个错误“不能在属性初始化程序中使用实例成员 'brandViewM';属性初始化程序在 'self' 可用之前运行”和“这里不能调用非函数类型'brandViewM,删除'()''的值”

@main
struct testApp: App {

@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@StateObject var listViewModel: ListViewModel = ListViewModel()
@StateObject var brandViewM:brandViewM = brandViewM() //error here

var body: some Scene {
    WindowGroup {
        NavigationView {
            ContentView()
                .onAppear(){
                    UITableView.appearance().backgroundColor = .clear
                }
        }
        .environmentObject(listViewModel)
        .environmentObject(brandViewM)
    }
}
}

这是环境对象(几乎与 listViewModel 完全一样)

struct brandItem:Codable, Equatable {
    var selectedText:String
    var brandUsername:String
    var brandPassword:String
}

class brandViewM: ObservableObject {
@Published var branditems: [brandItem] = [] {
    didSet {
        saveBrandItem()
    }
}

let branditemsKey:String = "branditemsKey"

init() {
    getBrandItems()
}

func getBrandItems() {
    guard
        let data = UserDefaults.standard.data(forKey: branditemsKey),
        let savedDotItems = try? JSONDecoder().decode([brandItem].self, from: data)
    else { return }
    
    self.branditems = savedDotItems
}

func deleteBrandItem(indexSet:IndexSet){
    branditems.remove(atOffsets: indexSet)
}

func addBrandItem(selectedText:String, brandUsername: String, brandPassword: String){
    let newBrandItem = brandItem(selectedText: selectedText, brandUsername: brandUsername, brandPassword: brandPassword)
    branditems.append(newBrandItem)
    print(newBrandItem)
}

func saveBrandItem() {
    if let encodedData = try? JSONEncoder().encode(branditems) {
        UserDefaults.standard.set(encodedData, forKey: branditemsKey)
    }
}
}

并且有@EnvironmentObject var brandVM: brandViewM 在我在ForEach 中显示字符串的视图中。这个环境对象与我创建的第一个环境对象之间的唯一区别是 ForEach 要求 brandItem 符合 Hashable,而第一个环境对象则需要它的 Equatable。任何帮助将不胜感激。

【问题讨论】:

  • 你能显示包含NavigationView { .. }.environmentObject(brandViewM)的视图的代码吗?

标签: swiftui observableobject environmentobject


【解决方案1】:

当您对类使用错误的命名时,就会发生这种情况。您正在使用:

.environmentObject(brandViewM) //error here

并且brandViewM 是一个类型(这就是错误告诉你的),而不是一个实例。你应该使用正常的约定 使用大写开始您的类型,而您的实例使用小写。现在你知道如何解决这个问题了。如果您想保留错误的命名,请使用:

.environmentObject(brandViewM()) //<--- here

【讨论】:

  • 基本上我只是用大写重命名了一个新文件,它可以工作,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 2012-03-15
  • 1970-01-01
  • 2015-04-03
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多