Swift 添加另一个环境视图失败
Swift fails to add another environment view
我有一个环境对象,效果很好,但后来我添加了另一个,当我把它放在最后一点时,它给了我一个错误“无法在 属性 初始值设定项中使用实例成员 'brandViewM';属性 初始值设定项 运行 在 'self' 可用之前”和“无法调用非函数类型的值 'brandViewM, Remove '()''” here
@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
。任何帮助将不胜感激。
当您为 类 使用错误的命名时会发生这种情况。您正在使用:
.environmentObject(brandViewM) //error here
和 brandViewM
是一种类型(这就是错误告诉您的内容),而不是实例。你应该使用正常的约定
使用大写字母开始你的类型,你的实例小写。现在你知道如何解决这个问题了。如果你想保留你的错误命名,使用这个:
.environmentObject(brandViewM()) //<--- here
我有一个环境对象,效果很好,但后来我添加了另一个,当我把它放在最后一点时,它给了我一个错误“无法在 属性 初始值设定项中使用实例成员 'brandViewM';属性 初始值设定项 运行 在 'self' 可用之前”和“无法调用非函数类型的值 'brandViewM, Remove '()''” here
@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
。任何帮助将不胜感激。
当您为 类 使用错误的命名时会发生这种情况。您正在使用:
.environmentObject(brandViewM) //error here
和 brandViewM
是一种类型(这就是错误告诉您的内容),而不是实例。你应该使用正常的约定
使用大写字母开始你的类型,你的实例小写。现在你知道如何解决这个问题了。如果你想保留你的错误命名,使用这个:
.environmentObject(brandViewM()) //<--- here