You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI视图间数据类型引用错误,编辑视图预览崩溃求助

SwiftUI模板编辑视图预览崩溃问题修复

问题概述

开发SwiftUI应用时,用户在TemplatesView选择模板后进入TemplateEditView编辑,两个视图共享Model数据,但TemplateEditView预览崩溃,存在以下错误:

  • Templates.init(backgroundOptions)提示“Cannot find 'backgroundOptions' in scope”;
  • TemplateEditView(template: Templates.backgroundOptions)提示无法将Templates.BackgroundOptions类型转换为预期的Templates类型,且实例成员backgroundOptions不能用于类型Templates。

修改后的代码

1. Data模型文件

import Foundation

// 简化模型结构,移除冗余嵌套
struct Template {
    var backgroundOption: Templates.BackgroundOptions
    
    init(backgroundOption: Templates.BackgroundOptions) {
        self.backgroundOption = backgroundOption
    }
}

struct Templates {
    enum BackgroundOptions: String, CaseIterable {
        case blank = "Blank"
        case fullBorder = "Full Border"
        case laurelWreath = "Laurel Wreath"
        case simpleLine = "Simple Lines"
    }
}

2. 模板选择视图(TemplatesView)

import SwiftUI

struct TemplatesView: View {
    var body: some View {
        NavigationView {
            VStack {
                Text("Choose a Template to Edit").font(.headline)
                List {
                    ForEach(Templates.BackgroundOptions.allCases, id: \.self) { option in
                        // 添加导航链接,传递正确的Template实例
                        NavigationLink(destination: TemplateEditView(template: Template(backgroundOption: option))) {
                            ZStack {
                                Image(option.rawValue)
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                Text(option.rawValue)
                                    .font(.title)
                                    .foregroundColor(.white)
                            }
                        }
                    }
                }
            }
            .navigationTitle("Epic Foundries🏆")
        }
    }
}

struct TemplatesView_Previews: PreviewProvider {
    static var previews: some View {
        TemplatesView()
    }
}

3. 模板编辑视图(TemplateEditView)

import SwiftUI

struct TemplateEditView: View {
    let template: Template
    
    var body: some View {
        VStack {
            HStack {
                Text("Name: \(template.backgroundOption.rawValue)")
                    .font(.subheadline)
                    .padding()
                Spacer()
            }
            HStack {
                Image(template.backgroundOption.rawValue)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .padding()
                Spacer()
            }
        }
        .navigationTitle(template.backgroundOption.rawValue)
    }
}

struct TemplateEditView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            // 传入具体枚举值创建Template实例,修复预览崩溃
            TemplateEditView(template: Template(backgroundOption: .blank))
        }
    }
}

关键修改说明

  1. 模型结构优化:移除原冗余的Templates结构体成员,让Template直接持有BackgroundOptions枚举值,避免类型混淆。
  2. 预览代码修复:预览时需要创建具体的Template实例并传入枚举值(如.blank),而非直接调用类型成员。
  3. 视图跳转补充:在TemplatesView的列表项中添加NavigationLink,实现点击模板跳转到编辑视图的功能,同时正确传递数据。
  4. 图片显示优化:给编辑视图中的图片添加.resizable()修饰符,确保图片能自适应布局。

内容的提问来源于stack exchange,提问作者YKWIBN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:47