从 UITableView 的 UI 中删除 header 和相应的单元格

Remove header and corresponding cells from UI in UITableView

如何从 TableView "Edit" UI 中删除 header 和整个部分?我知道可以使用 tableView.deleteSections() 在代码中执行此操作,但我需要用户在点击 "Edit" 按钮时能够执行此操作。

解释如下:

.

我正在使用 Swift 2.

让我们从定义 UITableViewHeaderFooterView 的自定义子 class 开始。此 class 将用于在 table 视图中显示 headers。

class HeaderView : UITableViewHeaderFooterView {

    var actionHandlerBlock: (Void -> Void)?;

    override init(reuseIdentifier: String?) {

        super.init(reuseIdentifier: reuseIdentifier)

        let button = HeaderView.SetupButton()
        addSubview(button);
    }

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

        let button = HeaderView.SetupButton()
        addSubview(button);
    }

    func removeButtonTapped(sender: AnyObject) {
        actionHandlerBlock?();
    }

}

private extension HeaderView {

    static func SetupButton() -> UIButton {
        let button = UIButton.init();
        button.addTarget(self, action: "removeButtonTapped:", forControlEvents: .TouchUpInside)
        button.setTitleColor(UIColor.redColor(), forState: .Normal)
        button.setTitle("Remove section", forState: .Normal)
        button.sizeToFit()
        return button
    }

}

这个class真的很简单。它的职责是创建带有一个附加视图的 header 视图 - 我们将使用该按钮来检测用户何时想要删除 table 视图的一部分。

每次用户点击 header 视图中的按钮时都会调用块 actionHandlerBlock

为了在用户点击我们的 header 视图中的按钮后删除部分,我们必须向 table 视图的委托提供一些自定义逻辑。

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.registerClass(HeaderView.self, forHeaderFooterViewReuseIdentifier: "header")

    //rest of your set up code here
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as! HeaderView
    header.actionHandlerBlock = { [section] in
        //don't forget to remove section from your data source here
        tableView.deleteSections(NSIndexSet(index: section), withRowAnimation: .None)
    }

    return header
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50
}

在函数 tableView:viewForHeaderInSection: 中,我们设置 header 视图的 actionHandlerBlock 属性。每次调用此块时,我们只需删除部分。请记住在调用 deleteSections: 方法之前修改 table 视图的数据源 - 您的数据源必须知道该部分的删除才能 return 正确的部分数量 numberOfSectionsInTableView: 数据源的功能。