Swift 无法添加另一个环境视图

Posted

技术标签:

【中文标题】Swift 无法添加另一个环境视图【英文标题】:Swift fails to add another environment view 【发布时间】: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)的视图的代码吗? 【参考方案1】:

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

.environmentObject(brandViewM) //error here

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

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

【讨论】:

基本上我只是用大写重命名了一个新文件,它可以工作,感谢您的帮助

以上是关于Swift 无法添加另一个环境视图的主要内容,如果未能解决你的问题,请参考以下文章

从另一个类触摸时的 Swift 按钮操作选择器:无法识别的选择器发送到实例

Swift - 无法向 UITableView 添加数据

Swift:无法让 UITextField 关闭键盘

如何使用 swift 在子视图中添加标签栏和导航栏?

xcode swift - 无法编辑后退按钮

无法在表格视图中选择单元格 - swift