【问题标题】:Can no longer interact with content within UICollectionViewCell or UITableViewCell in iOS 14 [duplicate]无法再与 iOS 14 中的 UICollectionViewCell 或 UITableViewCell 中的内容进行交互 [重复]
【发布时间】:2020-09-18 17:47:19
【问题描述】:

将我的手机更新到 iOS 14 后,我无法再与 UICollectionViewCellUITableViewCell 内的内容进行交互。该问题也存在于运行 iOS 14 的 iOS 模拟器中,但在 iOS 13 及更低版本中一切正常。

单元格中的按钮和其他集合视图不再可交互。就好像整个单元格内容都变成了静态的。下面是我的UICollectionViewCellsUICollectionViewController 中的一些代码,但是UITableViewCells 中存在同样的问题。我正在使用 Swift 5。didSelectItemAt 和类似的功能工作正常,它在单元格的 contentView 内进行交互,特别是似乎无法正常工作。如有必要,我可以粘贴更多代码,因为我修剪了一些绒毛,而其他代码我已经缩小到不成问题。

由于UICollectionViewCellUITableViewCell 都存在这个问题,我相信我在更根本的层面上做错了。

来自UICollectionViewCell的相关代码:

override init(frame: CGRect) {
    super.init(frame: frame)
    setupContainers()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func setupContainers() {
    // Adding subviews like so...
    addSubview(subviewToAdd)

    // Anchor all subviews using NSConstraints
}

然后是UICollectionViewController的相关代码

override func viewDidLoad() {
    super.viewDidLoad()
    setStyleAndDelegates()
}

private func setStyleAndDelegates() {
    collectionView?.backgroundColor = UIColor.white

    collectionView?.delegate = self
    collectionView?.dataSource = self
    
    collectionView?.register(MyCell.self, forCellWithReuseIdentifier: eventCellId)
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: eventCellId, for: indexPath) as! MyCell
    return cell
}

编辑: 在进一步检查视图层次结构后,在 iOS 14 的单元格中的所有内容之上直接放置了一个额外的UIView。在 iOS 13 中,此视图不存在。下面附上图片。

【问题讨论】:

  • 您发布的代码非常通用,并且您没有提供太多关于您的单元格组件以及您正在使用它们做什么的信息。您发布的代码调用了您未显示的 setupCellWithEvent() 方法。您确实显示了 UICollectionViewCell 子类的部分代码,但这看起来不完整。 (如果您使用dequeueReusableCell(withReuseIdentifier: for:) 调用它,它的init?(coder:) 方法将被调用,但您不支持该方法。
  • 您是否尝试过使用 Xcode 视图调试工具查看您的视图层次结构是否有问题?
  • 我已经完整地添加了setupCellWithEvent 函数,并将研究调试工具。谢谢! setupCellWithEvent 不对单元格本身的属性做任何事情,而是更新单元格子视图的内容。我确实使用dequeueReusableCell 调用,但是override init(frame: CGRect) 在某些时候也会被调用,因为单元格具有角半径和背景颜色。
  • 检查视图层次结构后,在单元格中所有内容的顶部直接放置了一个额外的UIView。这不会出现在 iOS 13 中(如添加到问题中的图片所示)。同样的事情发生在我的表格视图单元格中。我将如何去寻找这个视图是如何到达那里的?
  • 感谢您的帮助,我用视图层次结构解决了问题并添加了答案。我还将编辑问题并仅粘贴复制问题所需的相关代码。

标签: ios uitableview uikit uicollectionviewcell ios14


【解决方案1】:

感谢@Duncan C 推荐查看视图层次结构。

内容被addSubview()简单地添加到单元格

相反,内容应该添加到单元格的contentViewcontentView.addSubview()。这解决了问题。

在我当前的设置下,在 iOS 13 及以下版本中,仅使用 addSubview() 添加的内容出现在单元格的 contentView 上方。这在问题中显示的图片中得到了更好的描述。

在 iOS 14 和我当前的设置中,此内容被插入到单元格的 contentView 下方,因此 contentView 阻止了用户与直接添加到单元格的其余内容的交互。

【讨论】:

  • 这真的很有帮助,过去 3 天一直在使用它。
猜你喜欢
  • 2020-08-09
  • 2016-08-31
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多