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

使用CocoaPods的Shiny模块报错:类型'()'无法遵循'View'

解决SwiftUI中ShinyView的类型不兼容错误

问题根源

  1. SwiftUI的body属性要求必须返回一个符合View协议的对象,你的代码中在body里执行的都是无返回值操作(变量赋值、调用方法、添加子视图),这些操作的返回类型是(),完全不符合View协议要求。
  2. ShinyView是UIKit框架下的视图,不能直接在SwiftUI的body中通过addSubview这种UIKit方式添加,两者的视图体系需要桥接。

解决方案

使用SwiftUI提供的UIViewRepresentable协议,将UIKit的ShinyView包装成SwiftUI可识别的View类型:

1. 创建UIKit视图包装器

import SwiftUI
import Shiny

struct ShinySwiftUIView: UIViewRepresentable {
    // 创建并配置ShinyView
    func makeUIView(context: Context) -> ShinyView {
        let shinyView = ShinyView(frame: .zero) // 用.zero,后续由SwiftUI控制大小
        shinyView.colors = [.gray, .red, .green, .blue, .gray]
        shinyView.startUpdates()
        return shinyView
    }
    
    // 视图更新时的回调(无需额外操作可留空)
    func updateUIView(_ uiView: ShinyView, context: Context) {}
}

2. 在SwiftUI视图中使用包装后的视图

struct test: View {
    var body: some View {
        ShinySwiftUIView()
            .frame(width: 320, height: 200) // 用SwiftUI的frame修饰符控制视图尺寸
    }
}

#Preview {
    test()
}

关键说明

  • UIViewRepresentable是SwiftUI与UIKit视图桥接的标准方式,makeUIView负责初始化和配置UIKit视图,updateUIView用于响应SwiftUI状态变化更新视图。
  • 改用SwiftUI的frame修饰符控制视图大小,更贴合SwiftUI的布局逻辑,替代原来直接设置UIKit视图frame的方式。

内容的提问来源于stack exchange,提问作者Adam Leszczyński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:00:07