在滑动删除时,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 的页眉和页脚部分也滑动的主要内容,如果未能解决你的问题,请参考以下文章