swift - Swift + Xcode + macOS:非功能预览。错误与每个 Xcode 的 .environmentObject 相关
问题描述
我正在编写一个 Swift 程序,并试图让其中一个预览工作但没有运气。我收到的错误消息是:由于缺少 NavigationViewModel 类型的环境,程序崩溃。要解决添加 .envionmentObject(NavigationViewModel(...)) 到适当的预览。我已经尝试了几件事,但没有运气。如果有人能指出我的错误,将不胜感激。下面是我的代码。预览部分位于底部。问候克里斯
import SwiftUI
struct ListView: View {
@EnvironmentObject var navVM: NavigationViewModel
var body: some View {
Spacer().frame(height: 30)
VStack {
ForEach (navVM.options, id: \.self) { option in
switch option.id {
case 0:
HomeItem(imageName: option.imageName, title: option.title, id: option.id)
case 1, 4, 7:
MainItem(imageName: option.imageName, title: option.title, id: option.id)
case 2, 3, 5, 6, 8, 9:
SubItem(title: option.title, id: option.id)
default:
Text("Something went wrong")
} // end switch
} // end for each
} // end vstack
Spacer()
.frame(width: 180, alignment: .leading)
} // end var body
} // end list view
struct HomeItem: View {
let imageName : String
let title : String
let id: Int
// let currentViewId: Int
@EnvironmentObject var navVM: NavigationViewModel
var body: some View {
HStack{
Image(systemName: imageName)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 30, height: 30, alignment: .leading)
.foregroundColor(navVM.highLightedImage == id ? Color.blue : Color.black)
.padding(.leading, 20 )
.padding(.top, 10)
Text(title)
.font(.system(size: 15))
.underline()
.frame(width: 125, alignment: .leading)
.foregroundColor(Color.blue)
.padding(.top, 15)
.onTapGesture {
navVM.updateCurrentViewId(value: id)
navVM.updateSelectedItem(value: 0)
navVM.updateHighLightedImage(value: 0)
}
} // end hstack
}
}
struct MainItem: View {
let imageName : String
let title : String
let id: Int
@EnvironmentObject var navVM: NavigationViewModel
var body: some View {
HStack{
Image(systemName: imageName)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 30, height: 30, alignment: .leading)
.foregroundColor(navVM.highLightedImage == id ? Color.blue : Color.black)
.padding(.leading, 20 )
.padding(.top, 10)
Text(title)
.font(.system(size: 15))
.frame(width: 125, alignment: .leading)
.padding(.top, 10)
} // end hstack
}
}
struct SubItem: View {
let title: String
// let currentViewId : Int
let id: Int
@EnvironmentObject var navVM: NavigationViewModel
var body: some View {
HStack{
Text(title)
.font(.system(size: 13))
.underline()
.frame(width: 35, alignment: .leading)
.foregroundColor(Color.blue)
.padding(.bottom, 2)
.padding(.leading, 15)
.onTapGesture {
navVM.updateCurrentViewId(value: id)
navVM.updateSelectedItem(value: id)
switch navVM.selecteditem {
case 2, 3:
navVM.updateHighLightedImage(value: 1)
case 5, 6:
navVM.updateHighLightedImage(value: 4)
case 8, 9:
navVM.updateHighLightedImage(value: 7)
default:
navVM.updateHighLightedImage(value: 0)
}
}
switch navVM.currentViewId {
case id:
Image(systemName: "checkmark").padding(.bottom, 5).foregroundColor(Color.blue).opacity(100)
default:
Image(systemName: "checkmark").padding(.bottom, 5).foregroundColor(Color.blue).opacity(0)
}
} // end hstack
}
}
struct ListView_Previews: PreviewProvider {
@EnvironmentObject var navVM: NavigationViewModel
static var previews: some View {
ListView()
}
// .environmentObject(navVM: NavigationViewModel())
}
解决方案
将其添加到ListView()
非previews
变量中
ListView().environmentObject(navVM: NavigationViewModel())
推荐阅读
- javascript - 当我尝试在其中添加用户输入时,为什么我的表格单元格是空的?
- javascript - 无论区分大小写或填充,计算相同的单词
- xamarin.forms - 如何更改 Xamarin 表单中的 DatePicker Ok 和 Cancel 按钮文本?
- php - IIS 10 和 Symfony 5 ERR_TOO_MANY_REDIRECTS
- python - 以下 python 代码的输出是什么?
- c - 服务器不接受连接到客户端
- apache-spark - spark-avro 默认禁用 avro 逻辑类型
- linux - 如何从 Oauth2_proxy 登录页面隐藏域
- woocommerce - 相关产品部分的摘录
- r - 有没有办法让 y 轴位于镜像图的中间?