如何在 iOS 7 中刷新 UICollectionViewCell?
Posted
技术标签:
【中文标题】如何在 iOS 7 中刷新 UICollectionViewCell?【英文标题】:How to refresh UICollectionViewCell in iOS 7? 【发布时间】:2013-08-30 19:04:48 【问题描述】:我正在尝试在 Xcode 5 中开发我的应用程序并在 ios 7 环境下调试它。
我有一个自定义的 UICollectionViewLayoutAttributes。
我打算在长按UICollectionViewCell后做一些事情,所以我重写了UICollectionViewCell.m中的方法
- (void)applyLayoutAttributes:(MyUICollectionViewLayoutAttributes *)layoutAttributes
[super applyLayoutAttributes:layoutAttributes];
if ([(MyUICollectionViewLayoutAttributes *)layoutAttributes isActived])
[self startShaking];
else
[self stopShaking];
在 iOS 6 或更低版本中,- applyLayoutAttributes: 在我调用下面的语句之后被调用。
UICollectionViewLayout *layout = (UICollectionViewLayout *)self.collectionView.collectionViewLayout;
[layout invalidateLayout];
但是,在 iOS 7 中,即使我重新加载 CollectionView,- applyLayoutAttributes: 也不会被调用。
这是苹果稍后会修复的错误,还是我必须做点什么?
【问题讨论】:
【参考方案1】:在 iOS 7 中,您必须在 UICollectionViewLayoutAttributes 子类中覆盖 isEqual: 以比较您拥有的任何自定义属性。
isEqual: 的默认实现不比较您的自定义属性,因此总是返回 YES,这意味着永远不会调用 -applyLayoutAttributes:。
试试这个:
- (BOOL)isEqual:(id)other
if (other == self)
return YES;
if (!other || ![[other class] isEqual:[self class]])
return NO;
if ([((MyUICollectionViewLayoutAttributes *) other) isActived] != [self isActived])
return NO;
return YES;
【讨论】:
原来我需要用return [super isEqual:other]
替换最后一个return YES
。【参考方案2】:
是的。正如 Calman 所说,您必须重写 isEqual: 方法来比较您拥有的自定义属性。参见苹果文档here
如果您继承并实现任何自定义布局属性,您还必须重写继承的 isEqual: 方法来比较您的属性值。在 iOS 7 及更高版本中,如果这些属性未更改,则集合视图不会应用布局属性。它通过使用 isEqual: 方法比较新旧属性对象来确定属性是否已更改。由于此方法的默认实现仅检查此类的现有属性,因此您必须实现您自己的方法版本才能比较任何其他属性。如果您的自定义属性都相等,请调用 super 并在实现结束时返回结果值。
【讨论】:
【参考方案3】:在这种情况下,最有效的方法是
- (BOOL)isEqual:(id)other
if (other == self)
return YES;
if(![super isEqual:other])
return NO;
return ([((MyUICollectionViewLayoutAttributes *) other) isActived] == [self isActived]);
【讨论】:
以上是关于如何在 iOS 7 中刷新 UICollectionViewCell?的主要内容,如果未能解决你的问题,请参考以下文章