SwiftUI嵌入YouTube视频报-[__NSArrayM length:]错误求助
解决SwiftUI中WKWebView嵌入YouTube视频崩溃的问题
问题根源
崩溃的直接原因是初始化WKWebView时设置了极小的frame(0.1x0.1),YouTube嵌入页面的渲染逻辑在处理这种极端尺寸视图时,错误地向数组对象发送了length消息(该方法属于字符串类),触发了NSInvalidArgumentException。Google页面的布局逻辑对极小尺寸兼容性更好,因此未出现崩溃。
修复方案
方案1:调整WKWebView初始化配置
修改VideoView的makeUIView方法,移除极小frame设置,改用自动适配布局:
struct VideoView: UIViewRepresentable { let videoID: String func makeUIView(context: Context) -> WKWebView { let webView = WKWebView() // 设置自动适配父视图尺寸 webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] return webView } func updateUIView(_ uiView: WKWebView, context: Context) { guard let youtubeURL = URL(string: "https://www.youtube.com/embed/\(videoID)") else { return } uiView.scrollView.isScrollEnabled = false uiView.load(URLRequest(url: youtubeURL)) } }
方案2:在SwiftUI视图中指定明确尺寸
在ContentView中给VideoView添加frame约束,确保WebView有合理的初始尺寸:
struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext var body: some View { VStack() { VideoView(videoID: "CX-BdDHW0Ho") .frame(height: 200) // 根据需求调整高度 .frame(maxWidth: .infinity) // 适配宽度 } } }
额外检查
如果修复后仍有问题,可以暂时移除Introspect库测试,确认是否存在第三方库对WKWebView的干扰,但根据当前现象,核心问题还是WebView的初始尺寸设置不当。
内容的提问来源于stack exchange,提问作者Jan Verhagen
相关产品推荐
相关产品推荐

