我在同一个视图控制器中有两个tableview,tableview1
和tableview2
,两个tableviews中的单元格高度都是固定的,我还设置了delegate
和dataSource
它们,唯一的区别是当我进入视图控制器时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)
}
}
}
答案 0 :(得分:2)
rowHeight
属性和委托方法tableView(_:heightForRowAt:)
之间的区别在于为每个单元格调用委托方法,并且通常包含基本计算(当您有很多行时,它可能很昂贵)。
在您的情况下,由于行高是固定的并且对于每个单元格都相同,因此最好对rowHeight
个实例使用UITableView
属性。
每当你重新加载tableView / section时(使用reloadData()
或任何其他重载方法)都会调用delegate方法,所以请确保在获得数据后调用它。
如果委托不实现tableView(_:heightForRowAt :)方法,则可以为单元格设置行高。 rowHeight的默认值是UITableViewAutomaticDimension
[...]
使用tableView(:heightForRowAt :)而不是rowHeight会对性能产生影响。每次显示表视图时,它会在委托上为每个行调用tableView(:heightForRowAt :)