关于heightForRowAt的区别,并在UITableView中设置rowHeight

时间:2017-03-07 07:02:46

标签: ios swift uitableview

我在同一个视图控制器中有两个tableview,tableview1tableview2,两个tableviews中的单元格高度都是固定的,我还设置了delegatedataSource它们,唯一的区别是当我进入视图控制器时tableview1已有数据,但tableview2没有。

我的问题是我可以按func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat设置tableview1的行高,但对于tableview2,我必须在self.tableview2.rowHeight中设置viewDidLoad(),为什么会这样?

修改

代码

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
    }
}

我在其他视图控制器中获取tableView2的数据:

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)
        }
    }

}

1 个答案:

答案 0 :(得分:2)

rowHeight属性和委托方法tableView(_:heightForRowAt:)之间的区别在于为每个单元格调用委托方法,并且通常包含基本计算(当您有很多行时,它可能很昂贵)。 在您的情况下,由于行高是固定的并且对于每个单元格都相同,因此最好对rowHeight个实例使用UITableView属性。

每当你重新加载tableView / section时(使用reloadData()或任何其他重载方法)都会调用delegate方法,所以请确保在获得数据后调用它。

  

如果委托不实现tableView(_:heightForRowAt :)方法,则可以为单元格设置行高。 rowHeight的默认值是UITableViewAutomaticDimension

     

[...]

     

使用tableView(:heightForRowAt :)而不是rowHeight会对性能产生影响。每次显示表视图时,它会在委托上为每个行调用tableView(:heightForRowAt :)

     

Apple Documentation