2015-03-19 11 views
15

Ho un UITableview Sto cercando di aggiungere uno HeaderView sul mio UITableview.iOS Swift viewForHeaderInSection Non viene chiamato

Tuttavia viewForHeaderInSection non viene chiamato, ma vedo titleForHeaderInSection chiamato o visualizzato. Ho anche provato a usare un'intestazione di cella personalizzata per questo e anche questo non funziona.

Non ho idea di cosa sto facendo male.

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.title = "Groceries" 

    tableView.registerNib(UINib(nibName: "TransactionSpecifiedCategoriesTableViewCell", bundle: nil), forCellReuseIdentifier: "TransactionSpecifiedCategoriesTableViewCell") 
    tableView.registerNib(UINib(nibName: "TransactionSpecifiedCategoriesHeaderViewCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "TransactionSpecifiedCategoriesHeaderViewCell") 
    tableView.tableFooterView = UIView(frame: CGRectMake(0, 0, 0, 0)) 
} 

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

    let footerView = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 100)) 

    footerView.backgroundColor = UIColor.blackColor() 

    return footerView 

     //let header: UITableViewHeaderFooterView = view as UITableViewHeaderFooterView 
    //var headerView = UIView(frame: CGRectMake(0, 0, 100, 320)) 
    //headerView.backgroundColor = UIColor.blackColor() 
    //   
    //return headerView 
} 

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 200.0 
} 

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return "First section header title" 
} 

enter image description here

risposta

16

Procedimento viewForHeaderInSection appartiene al protocollo UITableViewDelegate. È quindi necessario impostare delegate della vista tabella sul controller di visualizzazione per ottenere questa richiamata. Probabilmente hai appena impostato la tableview dataSource mentre vengono chiamati gli altri metodi.

+0

Sì. Hai ragione. tableView.delegate = auto funziona. Grazie. dimenticato. – user3110353

+0

Felice di averlo aiutato. Non dimenticare di accettare questa risposta. Grazie – croX

+0

Se si utilizza la tabellaView dallo storyboard, è possibile impostare il metodo delegate dallo storyboard stesso. – iDevAmit

0

Ho riscontrato questo problema con viewForHeaderInSection che non viene chiamato in UITableViewController, che è il delegato per impostazione predefinita. È risultato che

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 

impediva a viewForHeaderInSection di essere richiamato. Pertanto, se la cosa delega non funziona, potrebbe essere necessario verificare che non si stia eseguendo l'override di uno degli altri metodi di intestazione della sezione.

+6

Solo per chiunque cerchi di eseguire il debug: per me è stato il contrario. 'viewForHeaderInSection' non è stato chiamato senza' heightForHeaderInSection'. – djv

20

In rapida 3

Si dovrebbe chiamare

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     let rect = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 44) 
     let footerView = UIView(frame:rect) 
     footerView.backgroundColor = UIColor.clear 
     return footerView 
    } 
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
     return 44 
    } 
+2

Mi mancava il metodo 'heightForHeaderInSection'. Se implementi solo la vista, non verrà chiamata. La stessa cosa per i footer. – OlivaresF

1

a Swift 3.0

è anche possibile aggiungere tableView.estimatedSectionHeaderHeight = 40 nella viewDid per ottenere viewForHeaderInSection chiamato