Ios UICollectionViewCell中的领域对象级别通知
我有一个包含相册对象的集合视图。一张相册可以通过点击单元格内的按钮来表示喜欢或不喜欢。按钮图像根据相册是否受欢迎而变化。这部分很简单,也很有效 我的问题是: 如果选择一个单元格,将显示一个新的视图控制器,其中包含该单元格中的相册对象。在此视图控制器中,您可以喜欢或不喜欢相册对象。现在,当我关闭此视图控制器时,单元格中的按钮不会根据Album的isFavorite属性进行更新。 我认为解决方案是在UICollectionViewCell内使用。因此,当您在不同的视图控制器中喜爱/不喜爱相册时,当您返回到收藏视图时,按钮是最新的。但是我不知道如何添加和删除通知-比如在哪里添加/删除以及在哪里根据通知进行更新 注意:请不要说使用collectionView.reloadData 这就是我到目前为止注意到的注释:var notificationToken:notificationToken?//这是我为领域添加通知的地方吗Ios UICollectionViewCell中的领域对象级别通知,ios,swift,notifications,realm,Ios,Swift,Notifications,Realm,我有一个包含相册对象的集合视图。一张相册可以通过点击单元格内的按钮来表示喜欢或不喜欢。按钮图像根据相册是否受欢迎而变化。这部分很简单,也很有效 我的问题是: 如果选择一个单元格,将显示一个新的视图控制器,其中包含该单元格中的相册对象。在此视图控制器中,您可以喜欢或不喜欢相册对象。现在,当我关闭此视图控制器时,单元格中的按钮不会根据Album的isFavorite属性进行更新。 我认为解决方案是在UICollectionViewCell内使用。因此,当您在不同的视图控制器中喜爱/不喜爱相册时,当您
有什么想法吗?我知道您不想被告知使用重载数据,但您是否考虑过重载项sat:[indepath]?这只会加载您首先单击的单元格。。。根据您的情况,这可能是一种更简单的方法 也就是说,我认为当单元格的相册值发生变化时,应该添加通知块。比如:
var album: Album! {
didSet {
self.notificationToken = album.addNotificationBlock { change in
// The block code
}
}
}
我知道你说过不要提到重载数据,但是如果视图控制器保证在屏幕外,并且会被调回屏幕上,我会直接调用重载数据,甚至只是重载项目卫星: [索引路径]将可见项的索引路径传递到视图将显示视图控制器的Animated:方法 这将比管理通知令牌集容易得多,尤其是当视图控制器在屏幕上时,如果您甚至没有使用通知令牌,那么首先: 这就是说,如果您希望避免手动更新视图,当它在屏幕上和屏幕外并且始终依赖于通知时,那么是的,领域的对象级通知将是最适合使用的功能,是的,将逻辑添加到集合视图单元格子类将是最合适的
class AlbumCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var favoriteButton: UIButton!
weak var delegate: AlbumCollectionViewCellDelegate?
var album: Album!
var notificationToken: NotificationToken?
@IBAction func didTapFavoriteButton(_ sender: UIButton) {
delegate?.didTapFavoriteButton(sender, album: album)
}
override func prepareForReuse() {
notificationToken.stop()
notificationToken = nil
}
func configure(with album: Album) {
titleLabel.text = album.title
favoriteButton.isSelected = album.isFavorite
self.album = album
notificationToken = self.album.addNotificationBlock { change in
switch change {
case .change(let properties):
for property in properties {
if property.name == "isFavorite" {
self.favoriteButton.isSelected = self.album.isFavorite
}
}
}
}
}
}
它工作得非常完美,非常感谢您如此清晰的解释,非常感谢!Realm和它背后的整个团队简直太棒了哈哈,太棒了!很高兴听到!不客气!我们都很高兴听到你在Realm玩得很开心DWe在使用Realm时遇到了一个小问题,希望是在启动应用程序之前的最后一个问题。我查看了领域任务的示例代码,但用例并不相似。你能看一下这个吗:谢谢!
class AlbumCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var favoriteButton: UIButton!
weak var delegate: AlbumCollectionViewCellDelegate?
var album: Album!
var notificationToken: NotificationToken?
@IBAction func didTapFavoriteButton(_ sender: UIButton) {
delegate?.didTapFavoriteButton(sender, album: album)
}
override func prepareForReuse() {
notificationToken.stop()
notificationToken = nil
}
func configure(with album: Album) {
titleLabel.text = album.title
favoriteButton.isSelected = album.isFavorite
self.album = album
notificationToken = self.album.addNotificationBlock { change in
switch change {
case .change(let properties):
for property in properties {
if property.name == "isFavorite" {
self.favoriteButton.isSelected = self.album.isFavorite
}
}
}
}
}
}