Swift如何在ViewController的viewWillDisappear中操作nib内IBOutlet停止视频
问题根源
你触发崩溃的核心原因是直接访问了DetailCollectionViewCell的类层级属性detailWeb,但detailWeb是绑定在Cell实例上的成员属性,不属于类本身,必然为空触发强制解包崩溃。
修复步骤
1. 先修正Cell的Delegate类型错误
你当前Cell里的Delegate类型配置错误,需要先调整:
class DetailCollectionViewCell: UICollectionViewCell { @IBOutlet weak var detailWeb: WKWebView! // 原代码这里Delegate类型写错了,改为协议类型 var delegate: DetailCollectionViewCellDelegate? // 新增公开方法:封装停止视频逻辑,避免外部直接操作WebView func stopInnerVideo() { // 先判空,避免解包崩溃 guard let validWeb = detailWeb else { return } // 方案1:执行JS暂停所有视频,保留页面内容,体验更好 validWeb.evaluateJavaScript("document.querySelectorAll('video').forEach(item => item.pause())") // 方案2:如果需要彻底清空内容,加载空白页 // validWeb.load(URLRequest(url: URL(string: "about:blank")!)) } // 原有其他代码保持不变... }
2. 修改PageViewController的viewWillDisappear逻辑
不要访问类属性,改为获取当前可见的Cell实例再操作:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 遍历所有可见Cell,找到详情Cell调用停止播放方法 collectionView.visibleCells.forEach { cell in if let detailCell = cell as? DetailCollectionViewCell { detailCell.stopInnerVideo() } } }
可选优化
如果Cell需要频繁复用,可以在Cell的复用生命周期方法里添加停止逻辑,避免复用时还在播放:
override func prepareForReuse() { super.prepareForReuse() stopInnerVideo() }
内容的提问来源于stack exchange,提问作者Oguzhan Varsak
相关产品推荐
相关产品推荐

