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 无法添加另一个环境视图的主要内容,如果未能解决你的问题,请参考以下文章