9

我正在使用 Swift 2.3 和 Xcode 8 Beta 1 将我的应用程序更新到 iOS10,我发现UITableViewHeaderFooterContentView在我的UITableViewHeaderFooterView.

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

1) 有这方面的文件吗?

2) 如何确保我的 UI 元素位于 iOS10 中新的 Content View 之上?(或允许通过 触摸UITableHeaderFooterContentView

谢谢!

iOS9.3和iOS10的Debug View Hierarchy

表头.xib

表头

import UIKit

class TableHeader: UITableViewHeaderFooterView {

    @IBOutlet weak var dayLabel: UILabel!

    @IBOutlet weak var dateLabel: UILabel!

    @IBOutlet weak var addNewEventButton: UIButton!

}

Code In View Controller dateCell.addNewEventButton是 iOS10 中不再接收触摸的 UIButton

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {


    let tintColor = TintManager().getTintColour()

    let dateCell:TableHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") as! TableHeader

    //dateCell.bringSubviewToFront(dateCell.addNewEventButton)

    dateCell.dayLabel.text = Dates.day.uppercaseString

    dateCell.dateLabel.text = Dates.date

        dateCell.backgroundView = UIView(frame: dateCell.frame)
        dateCell.backgroundView!.backgroundColor = tintColor
        dateCell.dayLabel.textColor = UIColor.whiteColor()
        dateCell.dateLabel.textColor = UIColor.whiteColor()
        dateCell.addNewEventButton.backgroundColor = tintColor



    dateCell.addNewEventButton.tag = section
    dateCell.addNewEventButton.layer.cornerRadius = 20.0

    if (savedEventView.superview === self.view) {
        dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
        dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddButtonToInsertSavedEvent(_:)), forControlEvents:.TouchUpInside)
    } else {
        dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
        dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddNewEventOnTableViewHeader(_:)), forControlEvents:.TouchUpInside)
    }

    return dateCell
}
4

1 回答 1

6

令人不快的观点实际上是contentViewUITableViewHeaderFooterView参见Apple Docs)。所以你应该能够使用sendSubview(toBack:)它来阻止它干扰触摸。

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

override func awakeFromNib() {
    if #available(iOS 10, *) {
        self.sendSubview(toBack: contentView)
    }
}

(*) 沉迷于疯狂的猜测,我的猜测是 Apple 的UITableViewHeaderFooterView代码主要基于UITableViewCell. 由于 IBUITableViewCells在其对象库中有(注意这些包括单元格的contentView),它可以确保单元格的 contentView 被正确实例化。但是由于UITableViewHeaderFooterView对象库中没有,因此无法contentView正确加载。看起来他们通过实例化一个空的contentView. 可惜他们没有添加UITableViewHeaderFooterView到图书馆。

于 2016-06-27T19:39:36.213 回答