Ios UITableView中Rowat和set rowHeight的高度差异
我在同一个视图控制器中有两个tableview,Ios UITableView中Rowat和set rowHeight的高度差异,ios,swift,uitableview,Ios,Swift,Uitableview,我在同一个视图控制器中有两个tableview,tableview1和tableview2,两个tableview中的单元格高度都是固定的,我还为它们设置了delegate和dataSource,唯一的区别是tableview1在我进入视图控制器时已经有了数据,但是tableview 2不要这样做 我的问题是我可以通过func tableView(\utableview:UITableView,heightForRowAt indexath:indexPath)->CGFloat设置tableV
tableview1
和tableview2
,两个tableview中的单元格高度都是固定的,我还为它们设置了delegate
和dataSource
,唯一的区别是tableview1
在我进入视图控制器时已经有了数据,但是tableview 2
不要这样做
我的问题是我可以通过func tableView(\utableview:UITableView,heightForRowAt indexath:indexPath)->CGFloat
设置tableView 1的行高,但是对于tableView 2
我必须在viewDidLoad()
中设置self.tableView 2.rowHeight
,为什么
编辑
代码
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)
}
}
}
rowHeight
属性和委托方法tableView(:heightForRowAt:)
之间的区别在于,委托方法是为每个单元格调用的,并且通常包含基本计算(当您有很多行时,它可能会很昂贵)。
在您的情况下,由于行高是固定的,并且每个单元格的行高都相同,因此最好对UITableView
实例使用rowHeight
属性
每当重新加载tableView/节时(使用
reloadData()
或任何其他重新加载方法),都会调用委托方法,因此请确保在获得数据后调用它
如果代理未实现tableView(u1;:heightForRowAt:)方法,则可以设置单元格的行高。rowHeight的默认值为UITableViewAutomaticDimension
[……]
使用tableView(:heightForRowAt:)而不是rowHeight会影响性能。每次显示表视图时,它都会为代理的每一行调用tableView(:heightForRowAt:)
所以,如果我还没有数据,
tableView(\uu:heightForRowAt:)
是无用的吗?另外,当我获取数据并使用reloadData()
,tableView(u:heightForRowAt:)
仍不工作时,为什么?只要有单元格要显示,就会调用委托方法。您可能返回了一个0
每个节的行数(检查该方法),并检查是否使用断点实际调用了该方法。我确信每个节的行数不是0
,但如果我使用tableView(U2;:heightForRowAt:)
您能插入代码更新您的第一篇文章吗@ioio007@ioio007您能用设置行高
属性的部分和行数部分
更新它吗?谢谢