使用CocoaPods的Shiny模块报错:类型'()'无法遵循'View'
解决SwiftUI中ShinyView的类型不兼容错误
问题根源
- SwiftUI的
body属性要求必须返回一个符合View协议的对象,你的代码中在body里执行的都是无返回值操作(变量赋值、调用方法、添加子视图),这些操作的返回类型是(),完全不符合View协议要求。 - 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
相关产品推荐
相关产品推荐

