2016-07-19 14 views
2

hinzufügen Nun, ich bin ein naives IOS Entwickler mit schnellen Sprache.Wie HeaderView von Nib zu UiTableView programmgesteuert in Swift

Ich habe eine Tabellenansicht, die eine Liste von Funktionen eines Hotels anzeigt. Jetzt möchte ich eine Header-Information zum TableView mit Hotelbild, Hotelname über der Tabellenansicht hinzufügen, so dass die Header-Informationen auch zusammen mit TableView-Inhalten scrollt (Produktmerkmalsliste)

Hier ist das Problem, TableView mit Liste der Funktionen funktioniert gut.

class HotelDetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 

    @IBOutlet weak var categoriesTableView: UITableView! 

    var items: [(String, String,String)] = [ 
     ("Service", " Courteous service, Good staff , Good staff"," Bad Facility"), 
     ("Vibe", " Courteous service, Good staff"," Bad Facility"), 
     ("Hotel", " Courteous service, Good staff"," Bad Facility"), 
     ("Room Facility", " Courteous service, Good staff"," Bad Facility"), 
     ("Amenities", " Courteous service, Good staff"," Bad Facility"), 
     ("Food", " Courteous service, Good staff"," Bad Facility") 
    ] 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     let nib = UINib(nibName: "HotelSnippetTableViewCell", bundle: nil) 
     categoriesTableView.separatorStyle = UITableViewCellSeparatorStyle.None 
     categoriesTableView.registerNib(nib, forCellReuseIdentifier: "CustomCell") 
     categoriesTableView.rowHeight = UITableViewAutomaticDimension 
     categoriesTableView.estimatedRowHeight = 100  
    } 



    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let customTableViewCell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as! HotelSnippetTableViewCell 

     let info = items[indexPath.row] 

     customTableViewCell.setCategory(info.0) 

     customTableViewCell.setPositive(info.1) 
     customTableViewCell.setNegative(info.2) 


     return customTableViewCell 

    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
     print("You selected cell #\(indexPath.row)!") 

    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return items.count 
    } 


} 

Für Header-Informationen wie Hotelimage, Hotelname und andere Labels Ich habe eine Spitze erstellt mit allen Ansichten eingestellt und eine entsprechende Klasse mit allen ihm zugeordneten Referenzen.

Jetzt, wie ich dieses UiView meiner Tabelle als eine Überschrift programmatisch hinzufügen (weil ich Daten nach Ruhepause erhalte).

Ich habe gesucht, fand aber Tutorials, wie Sie die Überschrift Abschnitt Header festlegen.

Paar Dinge, die ich ausprobiert:

  1. Ich fand, dass es eine Protokollfunktion für Tableview ist

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

Aber wie meine Feder hier zu laden und auf diesem Tableview und auch ich möchte dies nur programmatisch auslösen, nachdem ich die Daten vom Service bekommen habe

    Erstellen
  1. eine Feder mit Eltern als TableViewCell, laden sie dequeueReusableCellWithIdentifier() verwenden, setzen info und auf Tableview

    let headerCell = categoriesTableView.dequeueReusableCellWithIdentifier("HotelDetailHeaderTableViewCell") as! HotelDetailHeaderTableViewCell headerCell.setImageUrl(""); 
    
        headerCell.setHotelZmi(CGFloat(87)) 
    
    
        headerCell.setNameAndPersona("Fort Aguada Goa", persona: "OverAll", reviewsCount: "780") 
    
        headerCell.frame = CGRectMake(0, 0, self.categoriesTableView.bounds.width, 600) 
    
        categoriesTableView.tableHeaderView = headerCell 
    

Aber auch diese gewisse Ausnahme wirft, und ich kann nicht sehen, wo die Ausnahme ist (Wie sehen Sie das Ausnahmeprotokoll in Xcode?).

Ist der Prozess, den ich mache, korrekt? Wenn nicht jemand mir bitte effizienten Ansatz vorschlagen

Da in Android i verwendet, um eine NestedScrollView mit linearen Layout zu erstellen im Inneren mit einer beliebigen Anzahl von recyclerViews eingebettet (Entfernen Rolle für recyclerviews) und Relativelayout

Bitte helfen Sie mir.

+0

Sie brauchen, ist die Angabe zu Erstellen Sie "UIView" anstelle von "UITableViewCell" für HeaderVIEW, obwohl in Xib – xmhafiz

+0

Wie lade ich UIView in meinen Controller? – Manikanta

+0

gerade hinzugefügt meine Antwort – xmhafiz

Antwort

6

können Sie diesen Code verwenden, um Ihre nib Datei

let view = (NSBundle.mainBundle().loadNibNamed("MenuHeader", owner: self, options: nil)[0] as? UIView) 
tableView.tableHeaderView = view 

Dann wird Ihr MenuHeader init wird in ihm eine normale .xib Datei mit Ihrer Zelle, nur nicht vergessen, die Einschränkungen entsprechend anzupassen auf allen Bildschirmen passen das du willst.

+0

haben eine UiView-NIB erstellt und einer swift-Klasse zugeordnet, und die Ansichten Schnittstellen zu diesen Klassen zugeordnet, so dass ich Werte der Beschriftungen in der Spitze bearbeiten kann. Mit dem obigen Code bekomme ich UiView, wie kann ich auf Ansichten innerhalb der UiView Nib (wie Bildansicht, Beschriftungen in UIView) zugreifen? – Manikanta

+0

Wenn Sie bereits eine Klasse für Ihre UIView haben, müssen Sie Ihre NIB-Datei mit dieser Klasse verbinden und dann können Sie "view.label.text" verwenden und dann Ihre Werte ändern. Denken Sie daran, einen Verweis auf diese Ansicht beizubehalten oder erstellen Sie einfach einen neuen, wenn Sie die Kopfzeileninformationen ändern müssen. –

+0

Vielen Dank endlich Ihre Arbeit – Manikanta

-1

In Ihrer viewForHeaderInSection Last der benutzerdefinierten Ansicht von xib und sendet es

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    // for example you have xib as 'CustomHeaderView.xib' 
    let headerView = CustomView() 
    headerView.myLabel.text = "My Title" 

    return headerView 
} 

Eine andere Methode, um die Kopfhöhe

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 60.0 // put your height here 
} 
+0

Ich habe eine UiView NIB erstellt und eine schnelle Klasse zugeordnet, und die Ansichten Schnittstellen zu diesen Klassen zugeordnet, so dass ich Werte der Etiketten in der Spitze bearbeiten kann. Mit dem obigen Code bekomme ich UiView, wie kann ich auf Ansichten innerhalb der UiView Nib (wie Bildansicht, Beschriftungen in UIView) zugreifen? – Manikanta

+0

können Sie verweisen http://stackoverflow.com/questions/33935566/custom-uiview-class-swift?answertab=votes#tab-top – xmhafiz

+0

Der Link sagt über das Erstellen einer Bezeichnung programmatisch, aber ich möchte auf Ansichten von Nib zugreifen . – Manikanta

2

Updates für schnelle 4

let view = (Bundle.main.loadNibNamed("TableViewHeader", owner: self, options: nil)![0] as? UIView) 
self.tableview.tableHeaderView = view