在自定义 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 单元格上都有白线