iOS10 - 在UITableView标题中封锁UIButton的ContentView

时间:2016-06-19 03:49:32

标签: ios xcode swift uitableview ios10

我正在使用Swift 2.3和Xcode 8 Beta 1将我的应用更新到iOS10,我发现有一个UITableViewHeaderFooterContentView阻止了我的子类{{1}上的UIButton的触摸}。

在Xcode 8 Beta 1模拟器上,UIButton适用于iOS9.3但不适用于iOS10。

1)有没有这方面的文件?

2)如何确保我的UI元素位于iOS10中的新内容视图之上? (或允许触及UITableViewHeaderFooterView

谢谢!

Debug View Hierarchy of iOS9.3 and iOS10

TableHeader.xib

表标题

UITableHeaderFooterContentView

视图控制器中的代码 import UIKit class TableHeader: UITableViewHeaderFooterView { @IBOutlet weak var dayLabel: UILabel! @IBOutlet weak var dateLabel: UILabel! @IBOutlet weak var addNewEventButton: UIButton! } 是在iOS10中不再接收触摸的UIButton

dateCell.addNewEventButton

1 个答案:

答案 0 :(得分:6)

违规视图实际上是contentView的{​​{1}}(请参阅Apple Docs)。所以你应该只能使用UITableViewHeaderFooterView来阻止它干扰触摸。

然而,似乎在iOS9下,如果从NIB加载视图,sendSubview(toBack:)无法正确初始化UITableViewHeaderFooterView。虽然contentView属性不是可选的,但它实际上是nil,如果您尝试访问它,则会出现BAD ACCESS错误。你也不能为contentView设置一个值(在代码中或在IB中作为出口),因为它是一个只读属性(*)。因此,我能想到的唯一解决方案是使用contentView来有条件地包含将contentView移动到后面的代码(如果您在iOS 10或更高版本上运行)。我会将相关代码放入您的子类中:

#available

(*)沉迷于疯狂猜测,我的猜测是Apple在override func awakeFromNib() { if #available(iOS 10, *) { self.sendSubview(toBack: contentView) } } 上大量使用UITableViewHeaderFooterView代码。由于IB在其对象库中有UITableViewCell(并注意这些包括单元格的UITableViewCells),因此它可以确保正确实例化单元格的contentView。但由于对象库中没有contentView,因此无法正确加载UITableViewHeaderFooterView。看起来他们通过实例化一个空的contentView在iOS10中修复它。可惜他们也没有将contentView添加到库中。