dequeueReusableHeaderFooterViewWithIdentifier为单元格返回nil,但dequeueReusableCellWithIdentifier不是

时间:2016-02-21 20:45:13

标签: ios swift uitableview

我正在使用Interface Builder中的原型单元格向表格视图添加页脚:

enter image description here

在实例化页脚时,dequeueReusableHeaderFooterViewWithIdentifier()对于单元格返回nil,但dequeueReusableCellWithIdentifier()不是。我在Interface Builder中创建了一个带有正确标识符的页脚视图:

然后我实例化页脚:

func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let id = "MyFooter"
//    this works:
//    guard let footerCell = self.todaysChoresTableView.dequeueReusableCellWithIdentifier(id) else { 
//        return nil 
//    }
    guard let footerCell = self.todaysChoresTableView.dequeueReusableHeaderFooterViewWithIdentifier(id) else {
        // this doesn't, always returning nil
        return nil
    }
}

为什么dequeueReusableHeaderFooterViewWithIdentifier()总是返回nil?

(lldb) po self.tableView.dequeueReusableHeaderFooterViewWithIdentifier(id)
nil

(lldb) po self.tableView.dequeueReusableCellWithIdentifier(id)
▿ Optional(<UITableViewCell: 0x7fa313c835f0; frame = (0 0; 600 44); clipsToBounds = YES; layer = <CALayer: 0x7fa313c73150>>)
  - Some : <UITableViewCell: 0x7fa313c835f0; frame = (0 0; 600 44); clipsToBounds = YES; layer = <CALayer: 0x7fa313c73150→

更新

我也尝试过这样做,虽然现在它不再是nil,但它似乎并没有根据我的IB设计构建视图:

tableView.registerClass(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: id)
let footerView: UITableViewHeaderFooterView? = self.todaysChoresTableView.dequeueReusableHeaderFooterViewWithIdentifier(id)
footerView!.backgroundColor = UIColor.redColor()
return footerView

2 个答案:

答案 0 :(得分:5)

您是否尝试使用以下代码在代码中注册NIB:

tableView.registerNib(UINib(nibName: "MyFooter", bundle: nil), forHeaderFooterViewReuseIdentifier: "MyFooterID")

答案 1 :(得分:3)

iOS SDK在某些时候改变了行为。

从iOS 10开始,我的应用程序出列使用dequeueReusableHeaderFooterViewWithIdentifier,但它返回nil。以前,在iOS 8和9中,它正确地出列。

我的修复方法是改为使用dequeueReusableCellWithIdentifier,然后使用cell.contentView返回视图。

或者,use a nib and register it