2017-01-25 5 views
0

Ich habe eine benutzerdefinierte Header-Ansicht für eine UITableView erstellt. Der Typ der Kopfzeile ist UITableViewCell. Ich setzte es im Storyboard und hinzugefügt, um es zu der Ansicht Hierarchie wie sein in der Abbildung untenBenutzerdefinierte HeaderView nur im letzten Abschnitt

gezeigt

enter image description here

Hier ist mein Code für UITableViewController

import UIKit 

class SecondCustomTableViewController: UITableViewController { 

    @IBOutlet weak var customHeaderView: UITableViewCell! 
    let array = ["Row 1", "Row 2", "Row 3"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    self.tableView.register(SecondCustomTableViewController.self, forHeaderFooterViewReuseIdentifier: "Header") 
    self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header") 

    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 3 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 3 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     cell.textLabel?.text = "\(array[indexPath.row])" 

     return cell 
    } 

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

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     print("\(customHeaderView) -> Section: \(section)") 
     return customHeaderView 
    } 
} 

Wenn ich es im Simulator führen Sie es sieht aus wie diese

enter image description here

Meine Frage ist: Warum mein benutzerdefinierter Kopf Welche Ansicht wird nur für den letzten Abschnitt angezeigt?

Die print-Anweisung in der viewForHeaderInSection Methode sieht wie folgt aus:

Optional(<UITableViewCell: 0x7ff287802200; frame = (0 0; 375 44); clipsToBounds = YES; layer = <CALayer: 0x600000038d00>>) -> Section: 0 
Optional(<UITableViewCell: 0x7ff287802200; frame = (0 0; 375 44); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x600000038d00>>) -> Section: 1 
Optional(<UITableViewCell: 0x7ff287802200; frame = (0 176; 375 44); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x600000038d00>>) -> Section: 2 

Ich wickelte auch die optionale es ein nicht optional, aber es ist das gleiche Verhalten zu machen. Wie die print-Anweisung zeigt, wird die Methode viewForHeaderInSection dreimal aufgerufen, warum also die Überschrift nur für den letzten Abschnitt angezeigt wird?

Ich hoffe jemand kann mir dabei helfen. Jeder Hinweis wird sehr geschätzt.

+0

Registrierst du es in deiner tableView und entfernst es in der Methode? – sdasdadas

+0

Ja, ich habe es getan. Ich arbeitete mit der gleichen Technik in einem anderen Projekt und es funktionierte. – user1895268

+0

Sie scheinen jedoch in Ihrem Beispiel nicht aus der Warteschlange herauszukommen. – sdasdadas

Antwort

2

Ich denke, weil UI-Elemente nicht kopiert werden können, was Sie tun, ist eine Instanz von UITableViewCell als IBOutlet. Besser können Sie Ihre Ansicht erstellen, wenn sie benötigt wird.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     return tableView.dequeueReusableCell(withIdentifier: "Header") as! UITableViewHeaderFooterView 
    } 

Ich hoffe, es hilft. Entschuldigung für mein schlechtes Englisch.

+0

Das ist genau richtig. Ein Blick hat eine Superansicht und eine Position. Es kann nicht an mehreren Positionen gleichzeitig platziert werden. Dazu müssten verschiedene Instanzen derselben Ansicht erstellt werden. – Sulthan

+0

Auch ich empfehle, eine UIView mit Hintergrundfarbe und Beschriftung im Inneren zu tun, ist ziemlich einfach und Sie müssen nicht Zellen mit wiederverwendbaren Bezeichnern und anderen Sachen erstellen. Erstellen Sie es einfach programmatisch \ –

+0

Ich denke, Sie haben Recht. Ich habe das Register und die Dequeue ... Methode funktioniert richtig. Ich habe folgendes versucht: 'let header = tableView.dequeueReusableHeaderFooterView (mitIdentifier:" Header ") header? .backgroundView = customHeaderView!' Und ich habe das gleiche Verhalten. Vielen Dank! Jetzt weiß ich, dass ich es nicht so machen kann – user1895268

Verwandte Themen