在自定义 tableView 单元格上使用 contentView 属性(作为标题传递)如何防止它使自定义属性无效?

Posted

技术标签:

【中文标题】在自定义 tableView 单元格上使用 contentView 属性(作为标题传递)如何防止它使自定义属性无效?【英文标题】:Using the contentView property on a custom tableView cell (being passed as a header) how to prevent it from nullifying the custom attributes? 【发布时间】:2016-05-10 17:38:36 【问题描述】:

例如,这是我的自定义单元格:

protocol SectionHeaderTableViewCellDelegate 
    func didSelectUserHeaderTableViewCell(sectionHeader: SectionHeaderTableViewCell, selected: Bool, type: Type)


class SectionHeaderTableViewCell: UITableViewCell 
    @IBOutlet weak var labelContainerView: LabelContainerView!
    @IBOutlet weak var sectionTitleLabel: UILabel!
    @IBOutlet weak var plusButton: UIButton!

    var type: Type?

    var delegate: SectionHeaderTableViewCellDelegate?
    var dog: Dog?

    let sections = [Type.Meals, Type.Exercise, Type.Health, Type.Training, Type.Misc]


extension SectionHeaderTableViewCell 
    @IBAction func plusButtonPressed(sender: AnyObject) 
        if let type = type 
            delegate?.didSelectUserHeaderTableViewCell(self, selected: plusButton.selected, type: type )
        
    

在我的控制器中,如果我添加 header.contenView 的返回,我会得到所需的标题结果,但不幸的是它会使自定义标题中包含的按钮无效,从而阻止它被调用。否则,如果我只是简单地返回标题,自定义标题单元格上的按钮会按预期工作,但标题会随着被删除的行移动,这显然是不雅观的,而不是我想要的。

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    guard let header = tableView.dequeueReusableCellWithIdentifier("sectionHeader") as? SectionHeaderTableViewCell else  return UITableViewCell() 

    header.delegate = self
    header.updateDogWithGender(dog)

    header.type = header.sections[section]

    header.sectionTitleLabel.text = header.sections[section].rawValue

    return header.contentView

moving headers

【问题讨论】:

【参考方案1】:

如果有人遇到类似情况,解决方案是创建一个 Nib 文件并根据需要对其进行自定义。通过转到文件 -> 新文件 -> ios -> 用户界面 -> 并选择查看来创建一个 nib 文件。 Create Nib file。我添加了我的视图和按钮以获得我想要的外观。 customize Nib。从那里我将自定义单元类更改为 UITableViewHeaderFooterView 并将我的插座和操作重新连接到新的 Nib 文件。

class SectionHeaderView: UITableViewHeaderFooterView ... previous code from above 

在控制器中更新 viewForHeaderInSection 函数以加载笔尖:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    let header = NSBundle.mainBundle().loadNibNamed("SectionHeader", owner: self, options: nil).first as? SectionHeaderView

    header?.delegate = self
    header?.updateDogWithGender(dog)

    header?.type = header?.sections[section]

    header?.sectionTitleLabel.text = header?.sections[section].rawValue

    return header

顺便说一下,我们首先在 loadNibNamed 属性的末尾声明了该属性,因为它返回一个 AnyObjects 数组,并且由于我的 Nib 文件仅包含一个包含标签和按钮的 UIView,因此我只需要其中的第一个也是唯一的项目数组。感谢我的导师 James 解决了这个问题!

【讨论】:

以上是关于在自定义 tableView 单元格上使用 contentView 属性(作为标题传递)如何防止它使自定义属性无效?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元格未显示放置在自定义单元格上的 UITableView(KPDropDown)

如何在自定义 UITableView 单元格上获取 UITextField 值

没有在自定义单元格上调用文本字段确实开始编辑

iOS UITableView 错误 - 每个其他 tableview 单元格上都有白线

如何使表格视图单元格上的按钮调用正确的 tableView:cellForRowAtIndexPath?

您可以在自定义单元格中制作 TableView 吗?