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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:24:03