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

点击CollectionView单元格时按需跳转AVPlayerViewController或详情页问题

解决UICollectionView点击单元格的分支逻辑问题

你的问题出在代码的执行顺序上:你先直接push了详情页,之后才去判断视频链接,这就导致不管帖子有没有视频,详情页都会被打开,有视频的话还会额外弹出播放器,自然就出现了两个界面同时触发的情况。

我们只需要调整逻辑顺序,先判断视频是否存在,再分支执行对应的操作,就能解决这个问题。下面是修正后的代码:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let post = postArray[indexPath.item]
    
    // 先检查视频链接是否有效:非空且能转换成合法URL
    if let videoLink = post.videoLink, !videoLink.isEmpty, let videoURL = URL(string: videoLink) {
        // 有有效视频链接,播放视频
        let avPlayer = AVPlayer(url: videoURL)
        let avController = AVPlayerViewController()
        avController.player = avPlayer
        present(avController, animated: true) {
            avPlayer.play()
        }
    } else {
        // 没有有效视频链接,跳转详情页
        let controller = PostDetailViewController.fromStoryboard(post: post)
        navigationController?.pushViewController(controller, animated: true)
    }
}

关键细节说明:

  • 我们把视频链接的判断放在最前面,用if let链式判断确保三个条件都满足:videoLink存在、非空字符串、能转换成合法的URL。这样可以避免空字符串或者无效格式的链接被误判为有效视频。
  • 通过else分支处理无视频的情况,确保两种操作是互斥的,只会执行其中一种。
  • 移除了原来的guard let(因为它会在视频链接无效时直接return,但此时我们还需要执行跳转详情页的逻辑,guard在这里不合适)。

这样修改后,点击单元格时就会根据帖子是否有有效视频,只触发播放视频或者跳转详情页其中一个操作啦。

内容的提问来源于stack exchange,提问作者H. Osjir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:47