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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:04