tableView的section和row
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tableView的section和row相关的知识,希望对你有一定的参考价值。
参考技术A 说起tableView,大家都不陌生,但是说起tableView的section和row,对其概念总是很模糊,什么不要线、设置线宽度、sectionHeader高度等等,有时还真得花一些时间去调试,总的说来,还是对tableView这些细节不太熟悉,下面我总结了一些小细节,希望对大家有所帮助1.一个section:两个cell之间的行间距无法改变
2.多个section:能改变两个相邻section的相邻cell之间的高度,即区头和区尾高度
3.cell默认是整个tableView都有分隔线的,即系统默认属性是
所以要想去掉分隔线,一般是
但是此时你会发现有内容的cell分隔线也没了,对于有内容的cell,我们一般是保留其分隔线的,不用急,往下看
4.上面说了,系统默认是
如果我们不手动去调用separatorStyle这个属性,cell之间是有线的,这时可以设置heightForFooterInSection和heightForHeaderInSection,值得注意的是,如果最底部区尾高度设置为0,下面无内容的cell的分隔线是去不掉的,所以只要给区尾设置一个高度即可去掉分隔线,同时保留有内容的cell的分隔线,至于区头和区尾设置多高根据需求而定
5.多个section有多个区头和区尾,如果设置区头过高,当你往上滑动时,区头也会往上移动,但是如果达到了tableView顶端,会发现第一个区头会停留在顶端,不再随cell移动而往上移动,但是你再往下拉,会随tableView滑动而下来,如果在自定义headerView时,如果想要这种效果,完全可以这么做
6.不设置相邻区头和区尾高度或者设置为0,在UITableViewCellSeparatorStyleSingleLine情况下,两个section之间的高度默认是分割线的高度
7.设置cell分隔线的宽度
宽度为0:
屏幕宽度:
小贴士:没有数据时,记得去掉分隔线哦,不然会有可能会有一条线在上面
1.系统默认UITableViewCellSeparatorStyleSingleLine,但不会出现多余的分隔线
2.如果不设置区头和区尾高度,或者设置为0,区头和区尾均为默认高度,大概为15
3.区头或者区尾高度设置成很小貌似不行,比如0.001,运行出来的效果还是差不多1的高度
4.区头和区尾会一直随着tableView滚动,不会停留在顶部或底部
在有规律的列表中,我们可以有四种选择布局,假如数据源数组为array
1.plain:返回section数为array.count 每组一个row 可以精确的改变两个cell之间的高度 但是区头会停留在顶部,需要做判断解决第一个区头高度问题
2.plain:返回section数为1 共array.count个row 无法改变两个cell之间的高度
3.grouped:返回section数为array.count 每组一个row 即使区头和区尾之间高度给的再小,高度依然接近于1
4.grouped:返回section数为1 共array.count个row 无法改变两个cell之间的高度
具体哪种按需求去选择
复杂的tableView也可以借鉴上面四种去选择
TableView didSelectRow 无法按预期结果执行
【中文标题】TableView didSelectRow 无法按预期结果执行【英文标题】:TableView didSelectRow could not perform as expected result 【发布时间】:2020-04-05 10:14:31 【问题描述】:根据显示的视频,我希望 TransactionListViewController 显示从 AccountViewController 中选择的单元格。
但是,TransactionViewController 仅显示 Section 0 Row 0 和 Section 0 Row 1,而其他部分和行继续显示 Section 0 Row 1
预期结果
Section 0, Row 0 将为 Section 0, Row 0 执行 segue 和 pull 数据
Section 0, Row 1 将为 Section 0, Row 1 执行 segue 和拉取数据
Section 1, Row 0 将为 Section 1, Row 0 执行 segue 和 pull 数据
Section 1, Row 1 将为 Section 1, Row 1 执行 segue 和拉取数据
第 2 节第 0 行将为第 2 节第 0 行执行 segue 和拉取数据
第 2 节第 1 行将为第 2 节第 1 行执行 segue 和拉取数据
#AccountTableViewController
var accTypePA : Results<AccTypePA>?
var accTypeCA : Results<AccTypeCA>?
var accTypeInv : Results<AccTypeInv>?
var accTypeAss : Results<AccTypeAss>?
var accTypeLbty : Results<AccTypeLbty>?
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
tableView.deselectRow(at: indexPath, animated: true)
if indexPath.section == 0
let strAccountPA = accTypePA
selectedPA = strAccountPA?[indexPath.row]
performSegue(withIdentifier: "SegToTransactionPage", sender: indexPath.row)
else if indexPath.section == 1
let strAccountCA = accTypeCA
selectedCA = strAccountCA?[indexPath.row]
performSegue(withIdentifier: "SegToTransactionPage", sender: indexPath.row)
else if indexPath.section == 2
let strAccountCA = accTypeCA
selectedCA = strAccountCA?[indexPath.row]
performSegue(withIdentifier: "SegToTransactionPage", sender: indexPath.row)
else if indexPath.section == 3
let strAccountCA = accTypeCA
selectedCA = strAccountCA?[indexPath.row]
performSegue(withIdentifier: "SegToTransactionPage", sender: indexPath.row)
else if indexPath.section == 4
let strAccountCA = accTypeCA
selectedCA = strAccountCA?[indexPath.row]
performSegue(withIdentifier: "SegToTransactionPage", sender: indexPath.row)
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if(segue.identifier == "SegToTransactionPage")
if let transactionVC = segue.destination as? TransactionTableViewController
transactionVC.selectedPA = self.selectedPA
transactionVC.selectedCA = self.selectedCA
transactionVC.selectedInv = self.selectedInv
transactionVC.selectedAss = self.selectedAss
transactionVC.selectedLbty = self.selectedLbty
# TransactionListTableViewController
var selectedPA : AccTypePA?
var selectedCA : AccTypeCA?
var selectedInv : AccTypeInv?
var selectedAss : AccTypeAss?
var selectedLbty : AccTypeLbty?
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if section == 0
print("Selected section 0 : \(section)")
return selectedPA?.transPAList.count ?? 0
else if section == 1
print("Selected section 1 : \(section)")
return selectedCA?.transCAList.count ?? 0
else if section == 2
print("Selected section 2 : \(section)")
return selectedCA?.transCAList.count ?? 0
else if section == 3
print("Selected section 3 : \(section)")
return selectedCA?.transCAList.count ?? 0
else if section == 4
print("Selected section 4 : \(section)")
return selectedCA?.transCAList.count ?? 0
return transactions?.count ?? 1
【问题讨论】:
调用 segue 时,每次只传递行performSegue(withIdentifier:
SegToTransactionPage", sender: indexPath.row)`。它不知道是哪个部分,因此它始终为 0 . 你还需要告诉它是什么部分indexPath.section
【参考方案1】:
为什么你只使用row
作为sender
而不是整个indexPath
?然后你就有了你需要做的所有信息。对我来说,你应该使用模型而不是 indexPath
来做 segue。这段代码很容易出错。
也可以在大多数地方使用 switch 代替if else
。
第二个屏幕如何知道您在第一个屏幕中选择了什么?你必须重新考虑你的实施。在第二个屏幕中,您不会对第一个屏幕上的部分索引进行操作。只需发送您想要显示的数据模型并从那里开始。
另外,您不要取消将之前设置的值设置为 `self.selectedPA' 和其他“选定”值。
【讨论】:
以上是关于tableView的section和row的主要内容,如果未能解决你的问题,请参考以下文章