Swift中TableView嵌套CollectionView如何执行segue跳转?
实现嵌套CollectionView点击跳转并传递影片模型的解决方案
步骤1:在HomeTableViewCell中添加选中回调闭包
由于CollectionView嵌套在TableViewCell内部,无法直接触发ViewController的segue,需要通过闭包将选中事件传递给上层的HomeViewController。
首先在HomeTableViewCell类中添加闭包属性:
class HomeTableViewCell: UITableViewCell { // 保留原有属性(如movieSection等) var onMovieSelected: ((Movie) -> Void)? // 替换Movie为你实际的影片模型类名 }
接着修改collectionView(_:didSelectItemAt:)方法,触发闭包并传递选中的影片:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let selectedMovie = movieSection?.movies[indexPath.row] else { return } onMovieSelected?(selectedMovie) }
步骤2:在HomeViewController中绑定回调并触发Segue
在TableView的cell配置方法中,为每个cell绑定选中回调,在回调内执行segue跳转:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "tablecell", for: indexPath) as! HomeTableViewCell cell.movieSection = movies?.response[indexPath.row] // 绑定选中回调 cell.onMovieSelected = { [weak self] movie in // 替换"showMovieDetail"为你在Storyboard中设置的segue标识符 self?.performSegue(withIdentifier: "showMovieDetail", sender: movie) } return cell }
步骤3:在prepare方法中传递影片数据到目标页面
实现HomeViewController的页面跳转准备方法,将选中的影片传递给详情页:
extension HomeViewController { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "showMovieDetail", let detailVC = segue.destination as? MovieDetailViewController, // 替换为你的详情页VC类名 let selectedMovie = sender as? Movie else { return } detailVC.selectedMovie = selectedMovie // 详情页需提前定义接收影片的属性 } }
关键注意事项
- 确保影片模型类(如示例中的
Movie)可以正常在页面间传递,自定义模型无需特殊处理,直接赋值即可 - 确认Storyboard中已创建对应segue,且标识符与代码中一致
- 使用
[weak self]避免循环引用,防止内存泄漏
内容的提问来源于stack exchange,提问作者Yavuz Ulgar
相关产品推荐
相关产品推荐

