簡體   English   中英

無法更改UITableView中節標題的文本屬性

[英]Cannot change text attributes of section header in 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似乎也無濟於事。 有人請幫忙!

嘗試在此處設置任何內容之前,請確保您實際要查找的屬性具有設置器。

問題

您僅設置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協議實現的解決方案

若要自定義包含在容器類的實例或層次結構中的實例時的類實例的外觀,請使用appearanceWhenContainedIn:獲取該類的外觀代理。 例如,根據包含導航欄的對象來修改欄按鈕的外觀:

我們的情況

UILabel.appearanceWhenContainedInInstancesOfClasses([UITableViewHeaderFooterView.self]).textColor = UIColor.whiteColor()

更多細節

解決方案2

您還可以創建自己的UIView子類並將其顯示在

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

這樣,您可以修改所需的任何內容,而不必嘗試自定義非常有限的內容

這可能是一個重復的問題,但是在閱讀(了大量)不同的解決方案之后,它們似乎都沒有闡明嘗試解決此問題時的一個重要難題,我認為進一步闡明這一點將具有建設性。這個問題。

TL; DR

無論是在結合使用titleForHeaderInSectionviewForHeaderInSection 創建並返回在viewForHeaderInSection一個UILabel並設置在heightForHeaderInSection頭的高度。

更詳盡的解釋

問題的根源:
由於willDisplayHeaderView的使用不當,我無法更改文本屬性。 這是因為僅應其他地方實例化標題的UIView(或UIView的子類) 之后才能使用此函數。 除非通過titleForHeaderInSectionviewForHeaderInSection進行創建,否則不會創建標題視圖。

從文檔中引用titleForHeaderInSection

返回值
一個字符串,用作節標題的標題。 如果返回nil,則該部分將沒有標題。

那么,百萬美元的問題:為什么我不能更改viewForHeaderInSectionwillDisplayHeaderView中的文本,除非我也為titleForHeaderInSection中的節標題設置了文本?
原來這是一個技巧問題! 有點。

在使用viewForHeaderInSection的情況下,文本實際上正在更改-您只是看不到它。 當您使用titleForHeaderInSection設置節標題的文本時,swift會自動為該節創建一個具有默認高度限制的UITableViewHeaderFooterView。 創建標題視圖的另一種方法是在viewForHeaderInSection中創建並返回UIView類型的類,但是要注意的是, 沒有創建默認的高度約束 ,因此最終得到高度為零的UIView容器,並且它不會在屏幕上顯示-但這可以通過重寫heightForHeaderInSection來給它一些高度來解決。

在使用willDisplayHeaderView的情況下,由於不正確地實現該功能而導致存在該問題。 類類型的UIView的報頭必須被創建或者通過返回在titleForHeaderInSection一個非空字符串值或返回willDisplayHeaderView之前在viewForHeaderInSection類類型的UIView的目的應該被使用。 這是因為該函數中名為“ view”的參數必須已經存在 ,才能更改其屬性。 似乎有點不費吹灰之力。

解決方案1

只需確保您從titleForHeaderInSection返回一個非空字符串值即可 這樣做將確保實例化標題視圖對象。 使用viewForHeaderInSection可以根據自己的喜好設置標題的屬性。

解決方案2

覆蓋函數viewForHeaderInSection並創建一個繼承自UIView的新對象(aka,UILabel,UITableViewHeaderFooterView,UIImageView或任何您喜歡的對象)。 返回該對象,然后(非常重要!)在heightForHeaderInSection中設置標題的高度。 無需通過這種方法使用titleForHeaderInSection

我還可以提出其他幾種解決方案,但實際上這兩種是唯一有意義的解決方案。 當然,如果您對使用Apple的默認方案的標題標題感到滿意,請省去所有麻煩,並單獨使用titleForHeaderInSection

我遇到了同樣的問題,並嘗試了Darksinge的答案(解決方案2)。 仍然沒有為我工作。

就我而言,添加到solution2時,我還需要在willDisplayHeaderView函數中更改textLabel顏色(或textLabel的其他元素)。 似乎內部的UIlabel對象在調用willDisplayHeaderView之前被覆蓋。(假設對象是UIlabel的實物,則被覆蓋) 這是一些補充說明。

這是代碼(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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM