- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先我要说的是,这似乎是 SO 上的一个常见问题,我已经阅读了从 Swift 到 Obj-C 能找到的每一篇文章。在过去 9 小时内我尝试了很多不同的方法,但我的问题仍然存在。
我有一个 vc (vc1),里面有一个 collectionView。在 collectionView 内部,我有一个自定义单元格,其中有一个标签和一个 imageView 。在 cellForItem 内部,我有一个属性,该属性也在自定义单元格内部,当从 datasource[indePath.item] 设置该属性时,单元格内部有一个属性观察器,用于设置标签和 imageView 的数据.
vc1 中有一个按钮可以按下 vc2,如果用户从 vc2 中选择某些内容,它就会通过委托(delegate)传递回 vc1。 vc2 被弹出。
正确的数据总是会被传回(我在调试器中检查了多次)。
问题是,如果 vc1 中有一个现有单元格,当新数据添加到数据源时,在我重新加载 collectionView 后,第一个单元格中的标签数据现在显示在新单元格和数据中的标签上新单元现在显示在旧单元的标签上。
我已经尝试了从prepareToReuse到删除标签的所有方法,但由于某种原因,只有单元格的标签数据变得困惑。奇怪的是有时标签会正确更新,有时则不会? imageView 始终显示正确的图像,即使标签数据不正确,我也不会遇到任何问题。数据源内的 2 个模型对象始终位于正确的索引位置并具有正确的信息。
可能是什么问题?
vc1: UIViewController, CollectionViewDataSource & Delegate {
var datasource = [MyModel]() // has 1 item in it from viewDidLoad
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell
cell.priceLabel.text = ""
cell.cleanUpElements()
cell.myModel = dataSource[indexPath.item]
return cell
}
// delegate method from vc2
func appendNewDataFromVC2(myModel: MyModel) {
// show spinner
datasource.append(myModel) // now has 2 items in it
// now that new data is added I have to make a dip to fb for some additional information
firebaseRef.observeSingleEvent(of: .value, with: { (snapshot) in
if let dict = snapshot.value as? [String: Any] else { }
for myModel in self.datasource {
myModel.someValue = dict["someValue"] as? String
}
// I added the gcd timer just to give the loop time to finish just to see if it made a difference
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
self.datasource.sort { return $0.postDate > $1.postDate } // Even though this sorts correctly I also tried commenting this out but no difference
self.collectionView.reloadData()
// I also tried to update the layout
self.collectionView.layoutIfNeeded()
// remove spinner
}
})
}
}
下面的自定义单元格。这是 myModel 属性观察器内部内容的简化版本。标签中显示的数据取决于其他数据,并且有一些条件可以确定它。在 cellForItem 内添加所有这些内容会创建一堆代码,这就是为什么我没有更新其中的数据(或在此处添加)并选择在单元格内执行此操作。但正如我之前所说,当我检查数据时,它总是 100% 正确的。属性观察器始终正常工作。
CustomCell: UICollectionViewCell {
let imageView: UIImageView = {
let iv = UIImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
return iv
}()
let priceLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
var someBoolProperty = false
var myModel: MyModel? {
didSet {
someBoolProperty = true
// I read an answer that said try to update the label on the main thread but no difference. I tried with and without the DispatchQueue
DispatchQueue.main.async { [weak self] in
self?.priceLabel.text = myModel.price!
self?.priceLabel.layoutIfNeeded() // tried with and without this
}
let url = URL(string: myModel.urlStr!)
imageView.sd_setImage(with: url!, placeholderImage: UIImage(named: "placeholder"))
// set imageView and priceLabel anchors
addSubview(imageView)
addSubview(priceLabel)
self.layoutIfNeeded() // tried with and without this
}
}
override func prepareForReuse() {
super.prepareForReuse()
// even though Apple recommends not to clean up ui elements in here, I still tried it to no success
priceLabel.text = ""
priceLabel.layoutIfNeeded() // tried with and without this
self.layoutIfNeeded() // tried with and without this
// I also tried removing the label with and without the 3 lines above
for view in self.subviews {
if view.isKind(of: UILabel.self) {
view.removeFromSuperview()
}
}
}
func cleanUpElements() {
priceLabel.text = ""
imageView.image = nil
}
}
我在添加 priceLabel.text = ""
的所有位置添加了 1 个断点(总共 3 个),一旦 collectionView 重新加载,断点总是会被击中 6 次(对于 2 个对象来说,击中 3 次)第一次在 prepareForReuse
中,第二次在 cellForItem
中,第三次在 cleanUpElements()
最佳答案
结果我必须重置单元格内的属性。尽管单元格被重用并且priceLabel.text被清除,该属性仍然保持其旧的bool
值。一旦我通过 cellForItem 重置它,问题就消失了。
10 小时,smh
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell
cell.someBoolProperty = false
cell.priceLabel.text = ""
cell.cleanUpElements()
cell.myModel = dataSource[indexPath.item]
return cell
}
关于ios - CollectionViewCell 中标签中的数据有时会在重新加载时刷新,有时则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982323/
我有一个自定义 TagCollectionViewCell,它是一个自定义 UICollectionViewCell。在 .xib 时代,我曾经通过 UINib 实例化,但现在使用 Storyboar
不幸的是,我继续遇到约束问题......我绝对是我的问题,但我真的无法理解它们...... 我创建了一个带有自定义单元格的 UICollectionView。 在单元格内,我插入了一个带有所有约束的
在我的应用程序中,我将使用 Collection View ,但我遇到了问题。我在 Storyboard中设计了 Collection View 。我在 View Controller 中插入了一个
我正在使用连接到 CVCell 的 CollectionView 和捏合手势。我在单元格中有一张图像,并且捏合手势放大和缩小图像。我的问题是捏合手势仅适用于偶数行,不适用于奇数行。我的意思是,对于第一
我想隐藏被点击的单元格中的标签,而是显示图像。但我只想在具有特定索引的单元格已设置为 imageView 时才执行此操作。如果单元格设置为 imageView 或不设置,寻址单元格和存储的最佳方式是什
我希望每个 CollectionViewCell 显示图像并在点击时隐藏标签。但是,如果用户滚动图像,则会突然在其他未触摸过的过程中显示。如何识别某些细胞? override func collect
我正在尝试创建一个activityCell,因此当用户到达按钮时,它将显示一个带有事件指示器的单元格。这似乎工作正常,但是如果 moreDataAvailable 为 false 它应该删除此单元格。
我在 CollectionViewCell 中有 2 个标签和 1 个 ImageView 。我可以在单元格中设置图像,但无法在单元格中设置标签。 CollectionViewCell 类: clas
我正在制作一个程序,单个 View Controller 有两个 Collection View 。我已成功填充顶 View Controller ,但在添加第二个 Controller 时,我无法正
我水平滚动 CollectionView 单元格数量未知,它占据了除导航栏之外的整个屏幕。还有 CollectionViewCell,它占用整个 CollectionView。另外,在这个单元格内,我
我有一个布局,它使用多个collectionviewcells来布局。目前我使用的是静态高度,但众所周知,无法确定内容的大小,特别是在我的情况下,因为它将是占据单元格大部分的文本。我无法找到一种准确的
我正在发送从 collectionView 中选择的图像。问题是应用程序总是发送先前选择的图像。 indexPath 有什么问题? 这是 didSelectItemAt 函数: override fu
到目前为止,我一直在成功使用 UITableViews,但我无法让 UICollectionView 工作。 @interface NewsCollectionViewDataSource : NSO
我正在尝试在我的 Collection View 单元格内绘制一个简单的轮廓圆圈。由于某种原因,只有第一个单元格被绘制,其余的没有显示。 class UserCell: UICollectionVie
我使用 Xib 文件创建了一个 Collection View 单元格。我只有一个单元格,但该单元格显示在 collectionView 的中心。我想在 collectionView 的起始位置显示单
我有一个非常简洁的动画,它基本上为 Collection View 单元格绘制了一个边框。 我的动画运行良好,但我无法阻止它无限期地重复。 在:func collectionView(collecti
我一直在寻找学习这个 link 中的 Collection View 一天。在此链接中,它有 viewcontroller.h,.m 和 CustomCollectionCell.h,.m。 他们为什
我有 3 个单元格的 Collection View 。我在它们上面显示图像,但是,因为从服务器获取图像数据需要几秒钟,所以我使用 nsuserdefaults 和缓存。 let imagesFrom
我在使用 uicollectionview 时遇到问题。当我做一个collectionviewcell,在collectionviewcell里做一个uilabel的时候,突然uilabel不见了。
我已经为我的 UICollectionViewCell 设置了一个 UIPanGestureRecognizer,它应该像您经常在 UITableViewCells 中看到的那样工作,显示内容下方的控
我是一名优秀的程序员,十分优秀!