如何在SwiftUI应用中嵌入苹果Capturing Body Motion in 3D官方demo
崩溃原因
你遇到的崩溃是因为HumanViewController第42行的arView为nil,这个arView是@IBOutlet修饰的隐式解包可选值,从Storyboard加载ViewController时没有正确绑定Outlet,常见诱因有两个:
- Main.storyboard中id为
Main1的ViewController,类没有设置为HumanViewController - 该ViewController上的ARView没有和代码中的
@IBOutlet var arView: ARView!做连线绑定
修复方案
方案1:修复Storyboard绑定(适合保留Storyboard的场景)
- 打开项目中的Main.storyboard,选中id为
Main1的ViewController,在右侧身份检查器中将Class属性设置为HumanViewController - 选中该ViewController上的ARView控件,打开连接检查器,将
New Referencing Outlet拖到左侧的HumanViewController节点上,弹出选项时选择arView
方案2:舍弃Storyboard(更适合纯SwiftUI项目,避免绑定错误)
直接手动初始化ARView,不需要依赖Storyboard的Outlet绑定,修改代码如下:
第一步:修改HumanViewController代码
public class HumanViewController: UIViewController, ARSessionDelegate { // 删掉原来的@IBOutlet声明,改成手动初始化 var arView: ARView! public override func loadView() { // 手动创建ARView作为当前控制器的根视图 arView = ARView(frame: UIScreen.main.bounds) arView.autoresizingMask = [.flexibleWidth, .flexibleHeight] self.view = arView } // 剩下的viewDidAppear、session代理方法和原有代码保持一致即可 // ... 原有代码省略 }
第二步:修改封装器代码,不需要从Storyboard加载控制器
struct HumanViewControllerControllerWrapper: UIViewControllerRepresentable { typealias UIViewControllerType = HumanViewController func makeUIViewController(context: Context) -> HumanViewController { // 直接初始化控制器,不需要读取Storyboard return HumanViewController() } func updateUIViewController(_ uiViewController: HumanViewController, context: Context) {} }
额外注意事项
- 必须在Info.plist中添加摄像头权限描述
NSCameraUsageDescription,否则应用调用摄像头时会直接闪退 - 确保你已经将原demo中的3D模型资源
character/robot导入到你的项目中,否则模型加载失败会看不到虚拟角色 - 人体跟踪功能仅支持搭载A12及以上芯片的设备(iPhone XS/XR及更新机型),旧设备无法运行该功能
内容的提问来源于stack exchange,提问作者拔牙不打麻药
相关产品推荐
相关产品推荐

