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的主要内容,如果未能解决你的问题,请参考以下文章

tableview分组样式每组section之间距离的调整

如何动态添加Section和TableView Cell

展开和折叠 tableView Sections

如何在Android的RowTable中对齐文本和按钮

tableView刷新指定的cell 或section和滚动到指定的位置

TableView Sections 按过期排序