点击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
相关产品推荐
相关产品推荐

