重新加载表格视图后出现最后一个静态单元格分隔线

Posted

技术标签:

【中文标题】重新加载表格视图后出现最后一个静态单元格分隔线【英文标题】:Last static cell separator line appears after reloading table view 【发布时间】:2017-05-28 04:27:06 【问题描述】:

我正在使用下面的代码来摆脱最后一个静态单元格底部分隔线,它非常适合我不需要重新加载 tableView 的情况。一旦我重新加载我的 tableView 分隔线就会出现。

只有超级VC中的代码:

override func viewDidLoad() 
    super.viewDidLoad()
    let footerFrame = CGRect(x: 0.0, y: 0.0, width: 
    tableView.frame.size.width, height: 1.0)
    tableView.tableFooterView = UIView(frame: footerFrame)

调用后:

fileprivate func showDatePicker()

    datePicker.setValue(UIColor.white, forKey: "textColor")
    showsDatePicker = true

    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.contentInset = UIEdgeInsets(top: -20.0, left: 0.0, 
    bottom: 0.0, right: 0.0)

在我孩子的 tableView(didSelectRowAt indexPath:_) 中,我只是使用日期选择器更改单元格的高度:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    guard showsDatePicker else 
       switch indexPath.row 
        case CellIndex.withDatePicker:
            return 0.0
        default:
            return 44.0 
        
    

    switch indexPath.row 
        case CellIndex.withDatePicker:
            return 217.0
        default:
            return 44.0 
        

然后我画了分隔线!也许是因为使用了 STATIC 单元格,唯一的方法是向情节提要中的每个 viewController 添加空白视图?将tableView.tableFooterView = UIView() 替换为viewDid/WillLayoutSubviews 会导致空屏效果。我不想为情节提要中的所有控制器添加空白视图,也许有办法以编程方式进行?

【问题讨论】:

你能分享一下代码吗,到目前为止你做了什么? 是的,当然,但没有太多可分享的 override func viewDidLoad() super.viewDidLoad() tableView.tableFooterView = UIView() 在我的带有静态单元格的 tableView 的超类中,它会删除分隔符,直到我重新加载 tableView 我建议您在问题中分享上述代码(编辑您的问题),也请分享 TableView 委托和数据源方法。 我已经尽力了,希望现在更好,非常感谢! 【参考方案1】:

在显示最后一个单元格之前。

if indexPath.row == Your_last_Cell 

  cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);


创建具有最小高度的页脚:

func tableView(_ tableView: UITableView, 
heightForFooterInSection section: Int) -> CGFloat

// This will create a "invisible" footer
     return 0.01f; //CGFLOAT_MIN

func tableView(_ tableView: UITableView, 
 viewForFooterInSection section: Int) -> UIView?

UIView(frame: CGRectZero)


【讨论】:

谢谢,但我想找到更通用的方法,如果有的话 查看更新的答案,如果您正在寻找更通用的方法,您应该简单地隐藏 tableview 默认分隔符 tableView.separatorStyle = UITableViewCellSeparatorStyle.none 并创建自己的自定义分隔符。 输出是一样的,它隐藏分隔符,直到我重新加载 添加最后 2 个委托方法 丑陋的解决方案是将分隔符设置为 .none 并手动为每个单元格添加一个视图,所以你的答案是我认为最接近的一个【参考方案2】:

我实现这个结果的方法如下,

在你的 viewDidLoad 函数中,

override func viewDidLoad() 
    super.viewDidLoad()
    // Add this line
    yourTableView.tableFooterView = UIView()

定义表格视图的节数

func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 2

在你的 cellForRowAtIndexPath 函数中,

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
var cell: UITableViewCell?
switch indexPath.section 
    case 0:
        cell = tableView.dequeueReusableCellWithIdentifier("yourfirstcell")
        if indexPath.row == yourLastRowIndex 
        self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
    
    case 1:
        cell = tableView.dequeueReusableCellWithIdentifier("yoursecondcell")
    default:
        break
    
    return cell!

这种方法会对您有所帮助。

【讨论】:

谢谢,但我使用的是静态单元格,根本不想实现cellForRowAtIndexPath,如果我实现它,我应该为其他单元格返回什么?只是UITableViewCell() 我想不会... @DmitriyIvashin 根据您的情况更新了答案。

以上是关于重新加载表格视图后出现最后一个静态单元格分隔线的主要内容,如果未能解决你的问题,请参考以下文章

指定表格页脚时,最后一个单元格上的uitableview分隔符丢失

在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图

重新加载表视图数据并取消选择单元格

如何在单元格 Swift 2 中删除项目后重新加载表格视图

UITableView 在重新加载页面时在单元格顶部显示额外的分隔线

出现在空单元格中的表格视图分隔符