2017-03-07 1 views
0

I zwei tableview in der gleichen Ansicht Controller verfügen, tableview1 und tableview2, die Höhe Zellen in beiden Tableviews fixiert sind, und I gesetzt auch delegate und dataSource für sie ist der einzige Unterschied ist, dass tableview1 habe schon Daten, wenn ich den View-Controller betrete, aber nicht.Difference über heightForRowAt und setzen rowHeight in UITableView

Meine Frage ist, ich tableview1 die Zeilenhöhe von func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat aber für tableview2 einstellen Ich habe self.tableview2.rowHeight in viewDidLoad() zu setzen, warum ist das so?

EDIT

-Code

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView1: UITableView! // tag = 1 
    @IBOutlet weak var tableView2: UITableView! // tag = 2 

    var getDataViewController: GetDataViewController! 

    override func viewDidLoad() { 
     self.tableView1.delegate = self 
     self.tableView1.dataSource = self 
     self.tableView2.delegate = self 
     self.tableView2.dataSource = self 

     self.tableView2.rowHeight = 44 // work for tableView2 

     getDataViewController = storyboard!.instantiateViewController(withIdentifier: "getData") as! GetDataViewController 
    } 

    // ... 


    // Table View DataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if tableView.tag == 1 { 
      return tableView1DataArray.count 
     } 
     else if tableView.tag == 2 { 
      return tableView2DataArray.count 
     } 
    } 

    // Table View Delegate 
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if tableView.tag == 1 { 
      return 122 // work for tableView1 
     } 
     return 44 // not work for tableView2 
    } 
} 

ich tableView2 Daten in anderem View-Controller:

class GetDataViewController: UIViewController { 
    var mainViewController: MainViewController!   
    // ... 
    @IBAction func ok(_ sender: UIButton) { 
     let index = IndexPath(row: tableView2.count, section: 0) 
     // ... 
     let data = SomeData() 
     tableView2DataArray.append(data) 
     DispatchQueue.main.async { 
      mainViewController.tableView2.inserRows(at: [index], with: .automatic) 
     } 
    } 

} 

Antwort

2

Die Differenz zwischen der rowHeight Eigenschaft und der Delegatmethode tableView(_:heightForRowAt:) ist, dass die Delegate-Methode wird für jede Zelle aufgerufen und enthält normalerweise grundlegende Berechnungen (es kann teuer sein, wenn Sie viele Zeilen haben). In Ihrem Fall ist es besser, die -Eigenschaft für die beiden Instanzen UITableView zu verwenden, da die Zeilenhöhe fest und für jede Zelle gleich ist.

Die Delegate-Methode wird immer dann aufgerufen, wenn Sie den TableView/Abschnitt neu laden (unter Verwendung von reloadData() oder einer anderen Reload-Methode). Bitte stellen Sie sicher, dass Sie ihn aufrufen, sobald Sie die Daten erhalten haben.

Sie können die Zeilenhöhe für Zellen festlegen, wenn der Delegat die Methode tableView (_: heightForRowAt :) nicht implementiert. Der Standardwert von rowHeight ist UITableViewAutomaticDimension

[...]

Es Auswirkungen auf die Leistung sind mit Tableview (: heightForRowAt :) statt rowHeight. Jedes Mal, wenn eine Tabellenansicht angezeigt wird, ruft er Tableview (: heightForRowAt :) auf dem Delegierten für jede ihrer Zeilen

Apple Documentation

+0

Also, wenn ich Daten noch nicht, 'Tableview (_: heightForRowAt:) 'ist nutzlos? Auch wenn ich Daten bekommen habe und 'reloadData()' verwendet habe, funktioniert 'tableView (_: heightForRowAt:)' immer noch nicht, warum? – ioio007

+0

Die Delegate-Methode wird aufgerufen, wenn eine Zelle angezeigt werden soll. Sie haben möglicherweise eine "0" Anzahl von Zeilen pro Abschnitt zurückgegeben (überprüfen Sie diese Methode) und überprüfen Sie, ob sie tatsächlich mit Haltepunkten aufgerufen wird. –

+0

Ich bin sicher, die Anzahl der Zeilen pro Abschnitt ist nicht "0", aber rowHeight wird auf "-1.0" gesetzt, wenn ich 'tableView (_: heightForRowAt:)' – ioio007

Verwandte Themen