UItableView的删除(多选删除)以及UITableViewCell方法重写

通常在对tableView的数据有编辑操做的时候,会用到tableView的编辑状态,如收藏等须要操做的界面。编辑状态下能够对tableView进行增删改等的一系列操做,这里主要针对多选删除,对选删除的时候会涉及到cell的左侧对选按钮(图片)的设置,须要重写UITableViewCell的setEdting,setHighlighted,setSelected等方法,其中:setEdting只须要设置未选中状态图片;setHighlighted只须要设置高亮状态选中状态图片,非高亮状态不用设置;setSelected须要设置选中和未选中状态的图片api

import UIKit

class CKBaseCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: true)
        
        //编辑状态下只控制tableView编辑状态.none状态的图片
        if editing{
            for control in self.subviews{
                if control.isMember(of: NSClassFromString("UITableViewCellEditControl")!) {
                    for view in control.subviews{
                        if view.isKind(of: UIImageView.classForCoder()){
                            let image = view as! UIImageView
                            image.image = #imageLiteral(resourceName: "ic_collection_unchecked")
                        }
                    }
                }
            }
        }
    }
    
    override func setHighlighted(_ highlighted: Bool, animated: Bool) {
        super.setHighlighted(highlighted, animated: animated)
        if highlighted == true {
            contentView.backgroundColor = CKGlobalConst.ColorF4
        } else {
            contentView.backgroundColor = .white
        }
        
        //控制高亮状态的图片
        if isEditing {
            for control in self.subviews{
                if control.isMember(of: NSClassFromString("UITableViewCellEditControl")!) {
                    for view in control.subviews{
                        if view.isKind(of: UIImageView.classForCoder()){
                            let image = view as! UIImageView
                            //只设置高亮状态就能够,若是设置了else为未选中图片的话,当cell滑出界面或者刷新界面的话,即使cell状态设置为了已选中状态图片也会由于是非高亮状态而显示未选中图片
                            if highlighted {
                                image.image = #imageLiteral(resourceName: "ic_topic_checked")
                            }
                        }
                    }
                }
            }
        }
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
//        super.setHighlighted(selected, animated: animated)
        super.setSelected(selected, animated: animated)
        if selected == true {
            contentView.backgroundColor = CKGlobalConst.ColorF4
        } else {
            contentView.backgroundColor = .white
        }
        
        //控制选中状态图片(实例:收藏,选中后刷新或cell滑出界面以后,再出现的时候判断选中数组中是否包含该行cell,包含的话就将该行状态设置为选中状态,只要是选中状态就会走这个方法)
        if isEditing{
            for control in self.subviews{
                if control.isMember(of: NSClassFromString("UITableViewCellEditControl")!) {
                    for view in control.subviews{
                        if view.isKind(of: UIImageView.classForCoder()){
                            let image = view as! UIImageView
                            if selected{
                                image.image = #imageLiteral(resourceName: "ic_topic_checked")
                            }else{
                                image.image = #imageLiteral(resourceName: "ic_collection_unchecked")
                            }
                        }
                    }
                }
            }
        }
    }
}

在tableView中,若是cell滑出了界面或者界面进行刷新了的时候,须要在cellForRow的方法中判断当前cell是否包含于“要删除的数组”,包含于“要删除的数组”的cell设置其setSelected/isSelected为选中状态(True)数组

import UIKit

class CKCollectionController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var tableView: UITableView?
    var editButton = UIButton()
    var articleModelArray: [CKArticleModel] = []
    //要删除的文章ID
    var deleteIdArray: [String] = []
    //要删除的cell行数
    var deleteIndexArray: [String] = []
    let promptView = CKPromptView()
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        setNaviBar()
        setupUI()
        loadData()
    }
    
    func setNaviBar() {
        editButton.setTitle("    Edit   ", for: .normal)
        editButton.setTitleColor(UIColor.colorWithHex(hex: 0x35b3fc), for: .normal)
        editButton.titleLabel?.font = UIFont.systemFont(ofSize: 16)
        editButton.addTarget(self, action: #selector(editClick), for: .touchUpInside)
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: editButton)
        navigationItem.title = "Collection"
    }
    
    func loadData() {
        //第一次加载,显示loding
        if self.articleModelArray.count == 0 {
            //添加loading全局缺省图
            promptView.addDefaultView(self.view, #imageLiteral(resourceName: "loading"), CKMultilingual.loading)
        }
        
        //无网的时候,直接不请求
        if !CKUtil.isConnectedToNetwork() {
            promptView.removeDefaultView()
            if self.articleModelArray.count == 0 {
                //第一次加载或者总体数据为空,添加全局缺省图
                promptView.addDefaultView(self.view, #imageLiteral(resourceName: "no network"), CKMultilingual.Network_connection_is_abnormal, CKMultilingual.Click_on_the_screen_to_try_again, #selector(self.loadData))
            }
            return
        }
        
        let collectApi = CKCollectAPI()
        collectApi.callbackSuccess = { api in
            //清除loading
            self.promptView.removeDefaultView()
            
            var modelArray: [CKArticleModel] = []
            modelArray = (api as! CKCollectAPI).articleModelArray
            self.articleModelArray = modelArray
            if self.articleModelArray.count == 0 {
                //总体没有数据,添加全局缺省图
                self.promptView.addDefaultView(self.view, #imageLiteral(resourceName: "no content"), CKMultilingual.No_content_yet)
                self.editButton.setTitleColor(UIColor.gray, for: .normal)
                self.editButton.isUserInteractionEnabled = false
            }else{
                self.editButton.setTitleColor(UIColor.blue, for: .normal)
                self.editButton.isUserInteractionEnabled = true
            }
            self.tableView?.reloadData()
        }
        
        collectApi.callbackFailure = { error in
            print("\(error)")
            self.promptView.removeDefaultView()
            if self.articleModelArray.count == 0 {
                //总体没有数据,添加全局缺省图
                self.promptView.addDefaultView(self.view, #imageLiteral(resourceName: "no content"), CKMultilingual.No_content_yet)
            }
        }
        
        collectApi.execute()
    }
    
    func setupUI() {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.delegate = self
        tableView.dataSource = self
        //编辑状态可多选
        tableView.allowsMultipleSelectionDuringEditing = true
        tableView.estimatedRowHeight = 180
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.showsVerticalScrollIndicator = false
        tableView.backgroundColor = CKGlobalConst.ColorF4
        view.addSubview(tableView)
        self.tableView = tableView
        
        // 注册单图cell
        tableView.register(UINib.init(nibName: "CKNormalCell", bundle: nil), forCellReuseIdentifier: CKGlobalConst.normalCellID)
        // 注册多图图cell
        tableView.register(UINib.init(nibName: "CKMultiImageCell", bundle: nil), forCellReuseIdentifier: CKGlobalConst.multiImageCellID)
        // 注册无图cell
        tableView.register(UINib.init(nibName: "CKNoImageCell", bundle: nil), forCellReuseIdentifier: CKGlobalConst.noImageCellID)
        // 注册大图cell
        tableView.register(UINib.init(nibName: "CKLargeImageCell", bundle: nil), forCellReuseIdentifier: CKGlobalConst.largeImageCellID)
        // 视频cell
        tableView.register(UINib.init(nibName: "CKVideoCell", bundle: nil), forCellReuseIdentifier: "CKVideoCellID")
        
        tableView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
            make.center.equalToSuperview()
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return articleModelArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        var reuseID:String = CKGlobalConst.normalCellID
        if (articleModelArray[indexPath.row].images()?.count) ?? 0 >= 3{
            reuseID = CKGlobalConst.multiImageCellID
        } else if (articleModelArray[indexPath.row].images()?.count)  ?? 0 == 0 {
            reuseID = CKGlobalConst.noImageCellID
        } else if articleModelArray[indexPath.row].ctype == 1 {
            reuseID = CKGlobalConst.largeImageCellID
        }
        
        let cell: CKBaseCell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) as! CKBaseCell
        cell.model = articleModelArray[indexPath.row]
        
        //先判断文章是否已阅读
        if UserDefaults.standard.bool(forKey: "isRead\(String(describing: cell.model?.articleid))") == true {
            cell.titleLabel.textColor = UIColor.colorWithHex(hex: 0x989898)
        } else {
            cell.titleLabel.textColor = CKGlobalConst.Color2
        }
        
        if deleteIndexArray.count != 0 {
            for index in deleteIndexArray{
                if (index as NSString).integerValue == indexPath.row{
                    tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
//                    cell.setSelected(true, animated: false)
                    cell.isSelected = true
                }
            }
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView.isEditing {
            let cell: CKBaseCell = tableView.cellForRow(at: indexPath) as! CKBaseCell
            cell.isSelected = true
            //添加要删除cell的信息
            deleteIndexArray.append(String(describing: indexPath.row))
            //添加要删除的文章ID
            deleteIdArray.append(String(describing: articleModelArray[indexPath.row].id ?? 0))
            editButton.setTitle("Delete", for: .normal)
        }else{
            print(articleModelArray[indexPath.row])
            
            tableView.deselectRow(at: indexPath, animated: true)
            let detailController = CKDetailViewController()
            let cell: CKBaseCell = tableView.cellForRow(at: indexPath) as! CKBaseCell

            //存储已阅读状态
            UserDefaults.standard.set(true, forKey: "isRead\(String(describing: cell.model?.articleid))")
            cell.titleLabel.textColor = UIColor.colorWithHex(hex: 0x989898)
            detailController.articleModel = cell.model

            let navigationController: CKNavigationController = UIApplication.shared.keyWindow?.rootViewController as! CKNavigationController
            navigationController.pushViewController(detailController, animated: true)

            //MARK: - 数据埋点: 文章id
            CKUtil.setGatherWith("21", "1", "1", nil)
        }
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if tableView.isEditing{
            let cell: CKBaseCell = tableView.cellForRow(at: indexPath) as! CKBaseCell
            cell.isSelected = false
            //删除要取消删除cell的信息
            deleteIndexArray.remove(at: deleteIndexArray.index(of: String(describing: indexPath.row))!)
            //删除要取消删除的文章ID
            deleteIdArray.remove(at: deleteIdArray.index(of: String(describing: articleModelArray[indexPath.row].id ?? 0))!)
            if deleteIndexArray.count == 0 {
                editButton.setTitle("Cancel", for: .normal)
            }
        }
    }
    
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    //开始左滑删除操做时候的操做
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        editButton.isEnabled = false
        return .delete
    }
    
    //结束左滑删除操做的时候的操做
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete {
            
            let delCollectApi = CKDeleteCollect()
            delCollectApi.articleids = String(describing: articleModelArray[indexPath.row].id ?? 0)
            delCollectApi.callbackSuccess = {api in
                self.articleModelArray.remove(at: indexPath.row)
                tableView.deleteRows(at: [indexPath], with: .left)//平滑效果
            }
            delCollectApi.callbackFailure = {api in
                
            }
            delCollectApi.execute()
        }
        tableView.reloadData()
    }
    
    //左滑删除后的操做
    func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
        editButton.isEnabled = true
    }
    
    func editClick() {
        editButton.isSelected = !editButton.isSelected
        if editButton.isSelected {
            if deleteIndexArray.count != 0{
                deleteIndexArray.removeAll()
            }
            if deleteIdArray.count != 0{
                deleteIdArray.removeAll()
            }
            editButton.setTitle("Cancel", for: .normal)
            tableView?.setEditing(true, animated: true)
        }else{
            editButton.setTitle("  Edit  ", for: .normal)
            tableView?.setEditing(false, animated: true)
            
            let delCollectApi = CKDeleteCollect()
            delCollectApi.articleids = deleteIdArray.joined(separator: ",")
            delCollectApi.callbackSuccess = {api in}
            delCollectApi.callbackFailure = {api in}
            delCollectApi.execute()
            
            var delIdArray:[CKArticleModel] = []
            for index in self.deleteIndexArray{
                delIdArray.append(self.articleModelArray[(index as NSString).integerValue])
            }
            //获取要删除的文章ID
            for model in delIdArray{
                self.articleModelArray.remove(at: self.articleModelArray.index(of: model)!)
            }
            self.deleteIndexArray.removeAll()
            self.deleteIdArray.removeAll()
            tableView?.reloadData()
        }
    }
    
}
相关文章
相关标签/搜索