使用NotificationCenter在两个CollectionView间传递点赞单元格数据问题
问题原因
你在cell点赞方法中定义的aaa是方法内部的局部变量,作用域仅局限于当前方法内部,生命周期也只在方法执行期间,第二个ViewController完全无法访问到这个变量,因此会触发变量不在作用域的报错。
通知传值需要通过系统提供的参数通道携带数据,不要尝试用局部变量跨类传值。
具体修改方案
1. 调整点赞按钮所属CollectionViewCell代码
首先在cell中新增属性存储当前单元格对应的完整数据模型,发通知时携带该模型:
// CollectionViewCell where like button is located @IBOutlet weak var profilePictureImage: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var mainImage: UIImageView! @IBOutlet weak var desc: UILabel! @IBOutlet weak var logo: UIImageView! @IBOutlet weak var likeButton: UIButton! // 新增:存储当前cell对应的feed数据模型 private var currentFeed: feedPage? func setup(with myArray: feedPage){ // 赋值存储当前模型 currentFeed = myArray self.nameLabel.text = myArray.pfName self.desc.text = myArray.description self.profilePictureImage.image = myArray.pfp self.logo.image = myArray.pfp self.mainImage.image = myArray.mainImage self.likeButton.setImage(UIImage(named: "like"), for: UIControl.State.normal) } @IBAction func likeButoon(_ sender: Any) { // 发通知时将当前feed模型作为object参数传递 NotificationCenter.default.post(name: Notification.Name("AddToFavorites"), object: currentFeed) }
2. 调整接收通知的第二个CollectionViewController代码
修改数据源类型,接收通知时从参数中取出携带的模型数据:
// CollectionViewController two where I need to recieve a notification // 修改:数据源改为存储完整的feedPage模型,不要只存字符串 var favoriteFeeds: [feedPage] = [] override func viewDidLoad() { super.viewDidLoad() // 注册通知的代码保持不变 NotificationCenter.default.addObserver(self, selector: #selector(notificationRecieved), name: Notification.Name("AddToFavorites"), object: nil) } @objc func notificationRecieved(notification: Notification){ // 从通知参数中取出传递过来的feed模型 guard let likedFeed = notification.object as? feedPage else { return } // 可选:判断避免同一帖子重复添加 if !favoriteFeeds.contains(where: { $0.pfName == likedFeed.pfName && $0.description == likedFeed.description }) { favoriteFeeds.append(likedFeed) } // 刷新CollectionView展示新的点赞内容 collectionView.reloadData() } // 新增:页面销毁时移除通知观察者,避免内存泄漏 deinit { NotificationCenter.default.removeObserver(self, name: Notification.Name("AddToFavorites"), object: nil) }
额外优化建议
- 如果你的
feedPage模型有唯一标识字段(比如postId),建议用唯一标识做重复判断,准确率更高 - 后续配置第二个CollectionView的单元格时,直接从
favoriteFeeds数组中取对应位置的feedPage模型调用你已经写好的setup方法即可,和第一个列表的配置逻辑一致
内容的提问来源于stack exchange,提问作者Nergezeev Alik
相关产品推荐
相关产品推荐

