SwiftUI视图间数据传递:如何向NavBarMenuView传入FoodCategory模型
错误1:调用NavBarMenuView缺少categoryViewModel参数
NavBarMenuView定义了必填的categoryViewModel: FoodCategory参数,调用时必须传入对应的模型实例,不能直接空调用NavBarMenuView()。
错误2:String无法转换为FoodCategory类型
NavBarMenuView要求接收FoodCategory类型的参数,直接传入字符串(比如分类名称)不符合类型要求,必须传入完整的FoodCategory模型对象。
完整解决方案(结合你的跳转场景)
1. 修正模型拼写(隐藏坑)
注意你的代码里FoodСategory用了俄文的С,和英文的C是不同字符,会导致类型匹配失败,先统一改成英文:
struct FoodCategory: Codable { let name: String // 其他字段比如imageName等,根据JSON结构补充 }
2. 在首屏(MenuView)添加选中分类状态和跳转逻辑
struct MenuView: View { @StateObject var menuViewModel = MenuViewModel() // 修正拼写:MenuVieiwModel → MenuViewModel @StateObject var categoryTitleVM = CategoriesViewModel() @State private var selectedCategory: FoodCategory? // 存储选中的分类 var columns = Array(repeating: GridItem(.flexible(), spacing: 15), count: 3) var body: some View { NavigationView { VStack { // 首屏的4个带名称的图片,点击跳转详情页 ScrollView(.horizontal) { HStack(spacing: 20) { // 从categoryTitleVM中取前4个分类展示 ForEach(categoryTitleVM.categories.prefix(4)) { category in NavigationLink( destination: DetailView(selectedCategory: category), label: { VStack { Image(category.imageName) // 假设FoodCategory有imageName字段对应图片资源 .resizable() .scaledToFit() .frame(width: 80, height: 80) Text(category.name) .font(.caption) } } ) } } .padding() } // 首屏其他内容... } .navigationTitle("首页") } } }
3. 创建详情页(目标屏幕),传入正确参数到NavBarMenuView
struct DetailView: View { let selectedCategory: FoodCategory var body: some View { VStack(spacing: 0) { // 传入选中的FoodCategory实例 NavBarMenuView(categoryViewModel: selectedCategory) // 详情页其他内容... } } }
4. 确保NavBarMenuView的参数类型正确
struct NavBarMenuView: View { var categoryViewModel: FoodCategory // 用英文C的FoodCategory var body: some View { HStack { Button { // 可添加返回上一页的逻辑 } label: { Image(systemName: "chevron.left") .foregroundColor(.black) } Spacer() Text(categoryViewModel.name) // 展示选中分类的名称 .font(.callout) Spacer() Image("avatar") .resizable() .scaledToFit() .frame(width: 44, height: 44) } .padding(.horizontal, 20) .padding(.vertical, 10) } }
临时替代方案(不推荐)
如果仅需临时传递名称而非完整模型,可以修改NavBarMenuView的参数为String,但后续扩展会受限:
struct NavBarMenuView: View { var categoryName: String var body: some View { // ... 将原代码中的categoryViewModel.name替换为categoryName } }
调用时直接传字符串:NavBarMenuView(categoryName: selectedCategory.name)
内容的提问来源于stack exchange,提问作者Константин
相关产品推荐
相关产品推荐

