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

SwiftUI预览报错:'buildExpression'要求'MyApp'遵循View协议

问题解决:SwiftUI预览App结构体报错的处理

错误原因

你遇到的报错是因为MyApp遵循的是App协议,属于应用入口类型,而非View类型,但预览要求返回some View实例,直接返回MyApp()不符合类型要求,因此触发错误。

解决方案

方案1:直接预览目标视图(推荐)

既然你要预览的是“正在播放”栏(BottomPlayerView),可以直接在预览中创建该视图,同时注入所需的EnvironmentObject,还能手动控制显示状态:

struct MyApp_Previews: PreviewProvider {
    static var previews: some View {
        // 模拟包含BottomPlayerView的场景
        ZStack(alignment: .bottom) {
            // 用背景模拟ContentView的占位
            Color.gray.opacity(0.1)
                .ignoresSafeArea()
            
            BottomPlayerView()
                .offset(y: -40)
        }
        // 注入环境对象,强制设置show为true来显示播放栏
        .environmentObject(BottomPlayer(show: true))
    }
}

方案2:提取根视图统一复用

如果需要预览完整的根页面布局,可以把MyApp中WindowGroup内的内容提取为单独的View,这样既可以在App中使用,也能直接用于预览:

// 新增根视图结构体
struct RootView: View {
    @EnvironmentObject var bottomPlayer: BottomPlayer
    
    var body: some View {
        ZStack(alignment: Alignment(horizontal: .center, vertical: .bottom)) {
            ContentView()
            if bottomPlayer.show {
                BottomPlayerView()
                    .offset(y: -40)
            }
        }
    }
}

// 修改App入口
@main
struct MyApp: App {
    var bottomPlayer: BottomPlayer = BottomPlayer()

    var body: some Scene {
        WindowGroup {
            RootView()
                .environmentObject(bottomPlayer)
        }
    }
}

// 预览根视图
struct MyApp_Previews: PreviewProvider {
    static var previews: some View {
        RootView()
            .environmentObject(BottomPlayer(show: true))
    }
}

关键说明

  • SwiftUI的预览系统仅支持View类型的实例,App协议的结构体是应用的入口点,不能直接作为预览内容。
  • 通过environmentObject注入BottomPlayer实例,才能保证预览时的状态和实际运行一致,手动设置show: true可以直接看到播放栏的显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:55:11