无法更改UITableView中节标题的文本属性

时间:2016-03-08 22:58:17

标签: ios swift uitableview

我非常确定我已经尝试覆盖处理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 似乎也什么都不做。有人请帮忙!

3 个答案:

答案 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()

More Details

解决方案2

您还可以创建自己的UIView子类并在

下显示
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

通过这种方式,您可以修改任何您想要的内容,而不是尝试自定义定制内容非常有限的内容

答案 1 :(得分:2)

这可能是一个重复的问题,但在阅读(大量)不同的解决方案后,他们似乎都没有在解决这个问题时澄清一个重要的难题,我认为摆脱一些是有建设性的。关于这个问题的补充说明。

TL; DR

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”的参数必须已存在。看起来有点像脑子。

解决方案1 ​​

只需确保从 titleForHeaderInSection 返回非空字符串值;这样做将确保实例化标题视图对象。使用 viewForHeaderInSection 根据自己的喜好设置标题的属性。

解决方案2

覆盖函数 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
}