如何实现嵌套UICollectionView的Cell点击跳转并传递User信息?
解决嵌套UICollectionView的Cell点击跳转&传值问题
我看了你的代码结构,咱们可以通过闭包回调的方式来实现内层Cell的点击跳转和User信息传递,这个方法适配你现有的架构,改起来也简单:
第一步:给嵌套的CollectionView添加点击回调闭包
首先修改你的UserContainerViewCell,新增一个闭包属性,用来把点击到的User信息传递给上层的MainView。同时要实现内层CollectionView的点击代理方法,触发这个闭包:
class UserContainerViewCell: UICollectionViewCell { // 新增:定义闭包,用来传递点击的User对象 var onUserTap: ((UserProfile) -> Void)? // 你的原有属性:存放用户数组的featureUsers var featureUsers: [UserProfile]? // ... 你原有的初始化、布局代码 ... // 实现内层CollectionView的点击代理方法 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // 拿到被点击的User guard let tappedUser = featureUsers?[indexPath.row] else { return } // 触发闭包,把User传出去 onUserTap?(tappedUser) } // 你原有的cellForItemAt方法保持不变 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ident, for: indexPath) as! userCell let user = featureUsers![indexPath.row] cell.config(withUser: user) return cell } }
第二步:在MainView中接收回调并处理跳转
回到MainView的Cell创建方法里,给UserContainerViewCell的闭包赋值,在这里处理跳转逻辑,创建目标ViewController并把User传过去:
class MainView: UIViewController { // 你的原有属性:用户数组 var users: [UserProfile]? func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: userCellIdent, for: indexPath) as! UserContainerViewCell // 把用户数组传给嵌套的Cell cell.featureUsers = users // 新增:给闭包赋值,处理点击后的跳转逻辑 cell.onUserTap = { [weak self] tappedUser in // 1. 创建你的目标ViewController(比如叫UserDetailVC) let detailVC = UserDetailViewController() // 2. 把点击到的User传递给目标VC detailVC.selectedUser = tappedUser // 3. 执行跳转:如果是导航控制器就用push,否则用present self?.navigationController?.pushViewController(detailVC, animated: true) // 要是没有导航栏,就用这个: // self?.present(detailVC, animated: true) } return cell } // ... 你原有的其他代码 ... }
第三步:让目标ViewController接收User信息
最后,确保你的目标ViewController有对应的属性来接收传递过来的User:
class UserDetailViewController: UIViewController { // 用来接收传递的User对象 var selectedUser: UserProfile! override func viewDidLoad() { super.viewDidLoad() // 这里就可以用selectedUser来展示用户信息啦 // 比如设置标题、头像、详情等 title = selectedUser.name } }
为啥用闭包?
因为嵌套的Cell没办法直接拿到上层的MainView来做跳转操作,闭包相当于把点击事件的处理逻辑“委托”给了上层的ViewController,既解耦又符合你的代码结构,比代理模式写起来更简洁。
内容的提问来源于stack exchange,提问作者kamenr
相关产品推荐
相关产品推荐

