在滑动删除时,TableView 的页眉和页脚部分也滑动

Posted

技术标签:

【中文标题】在滑动删除时,TableView 的页眉和页脚部分也滑动【英文标题】:On swipe to delete, the header and footer section of the TableView swipe too 【发布时间】:2016-10-20 21:57:33 【问题描述】:

我的 TableView 有问题。添加部分页脚后,我意识到当我滑动删除时它会移动。

我创建了一个只有这个功能的最小项目来显示我面临的问题。 这是我得到的结果

我有两个 TableViewCell : DetailCell

import UIKit

class DetailCell: UITableViewCell 


@IBOutlet weak var myTextLabel: UILabel!


override func awakeFromNib() 
    super.awakeFromNib()


override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)



和 HeaderFooterCell

import UIKit

class HeaderFooterCell: UITableViewCell 
@IBOutlet weak var thisTextLabel: UILabel!

override func awakeFromNib() 
    super.awakeFromNib()


override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)



这是tableViewController

import UIKit

class TableViewController: UITableViewController 

override func viewDidLoad() 
    super.viewDidLoad()
    let statusBarHeight = UIApplication.shared.statusBarFrame.height
    self.tableView.contentInset = UIEdgeInsetsMake(statusBarHeight, 0.0, 0.0, 0.0)


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int 
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 5



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell", for: indexPath) as! DetailCell
        switch indexPath.row 
            case 0: cell.myTextLabel?.text = "one - one - one - one"
            case 1: cell.myTextLabel?.text = "two - two - two - two"
            case 2: cell.myTextLabel?.text = "three - three - three - three"
            case 3: cell.myTextLabel?.text = "four - four - four - four"
            case 4: cell.myTextLabel?.text = "five - five - five - five"
            default: break
        
        return cell


override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 44

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    let cell = tableView.dequeueReusableCell(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell
    cell.thisTextLabel.text = "Less"
    return cell


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

override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? 
    let cell = tableView.dequeueReusableCell(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell
    cell.thisTextLabel.text = "More"
    return cell


// MARK: RowAction for DELETE and MODIFY
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? 
    let delete = UITableViewRowAction(style: .destructive, title: "Delete")  (action, indexPath) in
        print ("Delete")
    

    let modify = UITableViewRowAction(style: .normal, title: "Modify")  (action, indexPath) in
        print("Modify")
    

    return [delete, modify]



我是不是弄错了,或者有没有办法水平“阻止”页眉和页脚?

【问题讨论】:

【参考方案1】:

将页眉和页脚的类型更改为 UITableViewHeaderFooterView 然后使用 .dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell") tableView 方法。不要忘记注册笔尖。我测试了下面的代码,它可以正常运行,没有您所写的问题。

import UIKit

class DetailCell: UITableViewCell 
  @IBOutlet weak var myTextLabel: UILabel!
  override func awakeFromNib() 
    super.awakeFromNib()
  




class HeaderFooterCell: UITableViewHeaderFooterView 
  @IBOutlet weak var thisTextLabel: UILabel!

  override func awakeFromNib() 
    super.awakeFromNib()
  



class TableViewController: UITableViewController 

  override func viewDidLoad() 
    super.viewDidLoad()
    let statusBarHeight = UIApplication.shared.statusBarFrame.height
    self.tableView.contentInset = UIEdgeInsetsMake(statusBarHeight, 0.0, 0.0, 0.0)

    self.tableView.register(UINib(nibName:"DetailCell", bundle: nil), forCellReuseIdentifier: "myTableViewCell")
    self.tableView.register(UINib(nibName:"HeaderFooterCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "headerOrFooterCell")
  

  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
  

  // MARK: - Table view data source

  override func numberOfSections(in tableView: UITableView) -> Int 
    return 1
  

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 5
  


  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell", for: indexPath) as! DetailCell
    switch indexPath.row 
    case 0: cell.myTextLabel?.text = "one - one - one - one"
    case 1: cell.myTextLabel?.text = "two - two - two - two"
    case 2: cell.myTextLabel?.text = "three - three - three - three"
    case 3: cell.myTextLabel?.text = "four - four - four - four"
    case 4: cell.myTextLabel?.text = "five - five - five - five"
    default: break
    
    return cell
  

  override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 44
  
  override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell

    cell.thisTextLabel.text = "Less"
    return cell
  

  override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat 
    return 44
  
  override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? 
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell
    cell.thisTextLabel.text = "More"
    return cell
  

  // MARK: RowAction for DELETE and MODIFY
  override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? 
    let delete = UITableViewRowAction(style: .destructive, title: "Delete")  (action, indexPath) in
      print ("Delete")
    

    let modify = UITableViewRowAction(style: .normal, title: "Modify")  (action, indexPath) in
      print("Modify")
    

    return [delete, modify]
  


【讨论】:

这是正确的。您不应该将 UITableViewCell 的实例用于不是 UITableViewCells 的东西(即页眉和页脚),否则您会得到这样的奇怪行为。我在使用 UITableViewCell 页眉和页脚删除和插入动画方面也有类似的经历。 我这样做了,但我遇到了问题。现在我有一个“以 NSException 类型的未捕获异常终止”错误。我很确定这与我现在在代码中注册单元格的事实有关,并且我正在使用原型单元格并在 IB 中提供了一个标识符。所以,我不能将我制作的原型用于页眉或页脚视图? 我明白了。我必须为 Cells 创建一个单独的 xib。工作正常

以上是关于在滑动删除时,TableView 的页眉和页脚部分也滑动的主要内容,如果未能解决你的问题,请参考以下文章

使用 javascript 在所有网页上插入页眉和页脚

页眉和页脚幻灯片动画的区别

访问同一视图页眉或页脚部分中的 Drupal 视图参数。

灵活的 css 布局,包含容器内的页眉、页脚和滚动体

控制表格视图页脚/部分的剪辑

动画 UITableView 的页眉和页脚