我非常确定我已经尝试覆盖处理UITableViewHeaderFooterView的每个函数来更改tableView部分中标题的文本,字体和textColor。
我尝试使用从另一个答案中找到的代码:
override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
header.contentView.backgroundColor = UIColor(red: 0/255, green: 181/255, blue: 229/255, alpha: 1.0)
header.textLabel!.textColor = UIColor.whiteColor()
header.alpha = 0.5
header.textLabel!.text = "foobar"
}
这成功地更改了 header.contentView 的背景颜色,但是只要我添加代码行来更改textLabel的文本,就不会显示任何内容(包括背景颜色)
我可以使用 titleForHeaderInSection 更改文字,但 willDisplayHeaderView 中的代码不会影响文字属性。覆盖 viewForHeaderInSection 似乎也什么都不做。有人请帮忙!
答案 0 :(得分:4)
在尝试设置任何内容之前,请确保您实际查找的属性具有设置器。
您只设置了contentView
,因为它可以与tintColor
一起设置,但其他属性标有get
,因此您可以获得值,但不要有权设置它。
来自文档
public var tintColor: UIColor! public var textLabel: UILabel? { get } public var detailTextLabel: UILabel? { get } // only supported for headers in grouped style public var contentView: UIView { get } public var backgroundView: UIView? public var reuseIdentifier: String? { get }
有一个解决方案可以使用UIAppearance Protocol
来实现在包含时自定义类实例的外观 在容器类的实例中,或层次结构中的实例, 使用appearanceWhenContainedIn:获取外观代理 类。例如,修改条形按钮的外观,基于 包含导航栏的对象:
我们的案例
UILabel.appearanceWhenContainedInInstancesOfClasses([UITableViewHeaderFooterView.self]).textColor = UIColor.whiteColor()
您还可以创建自己的UIView
子类并在
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
通过这种方式,您可以修改任何您想要的内容,而不是尝试自定义定制内容非常有限的内容
答案 1 :(得分:2)
这可能是一个重复的问题,但在阅读(大量)不同的解决方案后,他们似乎都没有在解决这个问题时澄清一个重要的难题,我认为摆脱一些是有建设性的。关于这个问题的补充说明。
将 titleForHeaderInSection 与 viewForHeaderInSection 或结合使用,在 viewForHeaderInSection 中创建并返回UILabel并设置高度 heightForHeaderInSection 中的标题。
问题的根源:
由于 willDisplayHeaderView 的使用不当,我无法更改文本属性。这是因为此函数只应在之后使用UIView(或UIView的子类),因为标头已在其他地方实例化。除非通过 titleForHeaderInSection 或 viewForHeaderInSection 完成,否则不会创建标题视图。
参考 titleForHeaderInSection 来自docs:
返回值
一个字符串,用作节标题的标题。如果你返回nil,该部分将没有标题。
所以,百万美元的问题:为什么我不能更改 viewForHeaderInSection 或 willDisplayHeaderView 中的文字,除非我也设置了 titleForHeaderInSection 中的节标题?
原来这是一个技巧问题!有点。
在使用 viewForHeaderInSection 的情况下,文本实际上正在改变 - 你只是看不到它。当您使用 titleForHeaderInSection 设置节标题的文本时,swift会自动创建一个UITableViewHeaderFooterView,其具有该特定节的默认高度约束。创建标题视图的另一个选项是在 viewForHeaderInSection 中创建并返回类型为UIView的类,但是需要注意的是默认高度约束不会被创建,因此最终得到一个高度为零的UIView容器,它不会显示在屏幕上 - 但是通过覆盖 heightForHeaderInSection 给它一些高度可以很容易地解决这个问题。
在使用 willDisplayHeaderView 的情况下,由于错误地实现该功能而存在问题。必须通过在 titleForHeaderInSection 中返回非空字符串值或在 willDisplayHeaderView <之前在 viewForHeaderInSection 中返回类型为UIView的对象来创建类类型UIView的标头。应该使用/ em>。这是因为在您更改其属性之前,该函数中名为“view”的参数必须已存在。看起来有点像脑子。
只需确保从 titleForHeaderInSection 返回非空字符串值;这样做将确保实例化标题视图对象。使用 viewForHeaderInSection 根据自己的喜好设置标题的属性。
覆盖函数 viewForHeaderInSection 并创建一个继承自UIView的新对象(也就是UILabel,UITableViewHeaderFooterView,UIImageView或任何适合你的东西)。返回该对象,然后(非常重要!)在 heightForHeaderInSection 中设置标题的高度。使用此方法无需使用 titleForHeaderInSection 。
我能够提出其他几种解决方案,但这两种解决方案实际上是唯一有意义的解决方案。当然,如果您对使用Apple的默认方案看部分标题的方式感到满意,请省去所有麻烦并专门使用 titleForHeaderInSection 。
答案 2 :(得分:0)
我遇到了同样的问题,并尝试了Darksinge的答案(解决方案2)。 仍然对我没用。
就我而言,添加到solution2时,我还需要在willDisplayHeaderView函数中更改textLabel颜色(或textLabel的其他元素)。 似乎内部的UIlabel对象在调用willDisplayHeaderView之前被覆盖。(假设对象是UIlabel的实物,则被覆盖) Here's some complimentary explanation.
这是代码(SearchTableSectionHeaderFooterView是自定义UITableViewHeaderFooterView类。)
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return tableView.dequeueReusableHeaderFooterView(withIdentifier: SectionHeaderFooterIdentifier) as! SearchTableSectionHeaderFooterView
}
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
// header textLabel color should be modified here
// ref) https://forums.developer.apple.com/thread/60735
(view as! SearchTableSectionHeaderFooterView).textLabel?.textColor = UIColor.red
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return cells[section].title
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 36
}