iOS swift UITableView的编辑,全选,删除操作

iOS中UITableView经常会出现需要对cell进行编辑,全选,删除等操作,在navigationItem的BarButtonItems上加载按钮,效果图如下


untitle.gif

我这里是,删除了现有的,如果还有数据,会继续加载,看之前写的上拉刷新跟下拉加载更多,上代码,代码里把上拉刷新,下拉加载代码去掉了,如有需要完整可以留言或私聊我

//
//  MESsagneVC.swift
//  ios
//
//  Created by 李鑫豪 on 2018/8/16.
//  Copyright © 2018年 李鑫豪. All rights reserved.
//

import UIKit
import SwiftyJSON
import ESPullToRefresh
class MESsagneVC: UIViewController,UITableViewDelegate,UITableViewDataSource{
 //懒加载
    lazy var myTableView: UITableView = {
        let vc = UITableView()
        vc.isEditing = false//默认设为不可编辑。点击编辑才可编辑
        return vc
    }()
   var pageNumber = 2  //第一次加载为1,因为打开界面的时候已经加载第一页了,默认下拉的时候加载第二页
    var messageCount = 0    //初始数
    var messageOriginalCount = 0      //加载时的原始数量
//编辑按钮
    lazy var rightBtn: UIButton = {
        let btn = UIButton()
        btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
        btn.setTitle("编辑", for: .normal)//默认为编辑
        btn.setTitle("完成", for: .selected)//点击之后为完成
        btn.setTitleColor(UIColor.blue, for: .normal)
        btn.setTitleColor(UIColor.blue, for: .selected)
        btn.addTarget(self, action: #selector(rightBtnAction), for: .touchUpInside)
        return btn
    }()
//删除按钮
    lazy var deleteBtn: UIButton = {
        let btn = UIButton()
        btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
        btn.setTitle("删除", for: .normal)//默认为删除
        btn.setTitleColor(UIColor.blue, for: .normal)
        btn.addTarget(self, action: #selector(deleteBtnAction), for: .touchUpInside)
        return btn
    }()
//全选按钮
    lazy var allBtn: UIButton = {
        let btn = UIButton()
        btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
        btn.setTitle("全选", for: .normal)//默认为全选
        btn.setTitle("取消", for: .selected)//点击全选之后为取消
        btn.setTitleColor(UIColor.blue, for: .normal)
        btn.setTitleColor(UIColor.blue, for: .selected)
        btn.isHidden = true  //默认不显示全选
        btn.addTarget(self, action: #selector(allBtnAction), for: .touchUpInside)
        return btn
    }()
    var value : [JSON] = []//result数组
    var messageData :[MESsageModel] = []//数据源
    var selectArray :[MESsageModel] = []//选择数据数组
    func getCooksData(isDeletALL:Bool,pageNumber:Int,pageSize:Int,completed:@escaping ()->Void)  {
        //  isDeletALL:是否删除数据源重新加载数据
        //pageNumber:加载页数
         //pageSize:每页的数据数。pageNumber,pageSize都是服务器的参数
        api.message_page_app(classification: -1, pageNumber: pageNumber, pageSize: pageSize){
            [weak self] result in
            guard let `self` = self else {return}
            if isDeletALL{
                self.messageData = []
            }
            self.messageOriginalCount = self.messageCount
            self.value = result["rows"].arrayValue
            for item in self.value
            {
                //处理返回的服务器返回的result 这里因人而异
                let message = MESsageModel()
                message.title = item["title"].stringValue
                message.content = item["content"].stringValue
                message.createTime = item["createTime"].stringValue
                message.id = item["id"].intValue
                self.messageData.append(message)
            }
            self.messageCount = self.messageData.count
            self.myTableView.reloadData()
            completed()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
       //设置数据源,代理
        myTableView.dataSource = self
        myTableView.delegate = self
        //布局
        self.view.addSubview(myTableView)
        myTableView.snp.makeConstraints{
            make in
            make.top.equalToSuperview().offset(tableNaiHeight)
            make.bottom.equalToSuperview()
            make.left.equalToSuperview()
            make.right.equalToSuperview()
        }
        //设置navigationItem.rightBarButtonItems为编辑,全选,默认不加载删除按钮
        navigationItem.rightBarButtonItems = [UIBarButtonItem(customView: rightBtn),UIBarButtonItem(customView: allBtn)]
        //下面为获取数据
        getCooksData(isDeletALL: true,pageNumber: 1,pageSize: 20,completed: {})
        navigationItem.title = "消息"
    }
    override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    // MARK: - Target
    @objc private func rightBtnAction(){
        self.selectArray.removeAll()//点击编辑之后要把选择数据源为空,因为默认点击全选时所有都是未选中的
        rightBtn.isSelected = !rightBtn.isSelected//设置选择状态
        allBtn.isSelected = !rightBtn.isSelected//设置全选按钮选择状态为选中即是全选
        allBtn.isHidden = !rightBtn.isSelected//设置是否隐藏全选按钮
        if rightBtn.isSelected {
//如果点击编辑按钮,则rightBtn.isSelected为true,加载删除button
            self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: deleteBtn)
            myTableView.setEditing(true, animated: true)//设置myTableView为可编辑状态
        } else {
          //else则为再次点击,恢复成原状,把删除button移除,设置myTableView为不可编辑状态,如果不移除删除button,删除button会占用navigationController的默认返回按钮
            self.navigationItem.leftBarButtonItems = []
            myTableView.setEditing(false, animated: true)
        }
    }
    @objc private func deleteBtnAction(){
        //如果selectArray.count,则选择数量大于0,有选cell
        if selectArray.count > 0 {
            var ids: [Int] = []
            //拿到selectArray里面的model,取id,为ids数组
            for model in selectArray{
                ids.append(model.id!)
            }
            //把ids发送给服务器,删除服务器数据
            api.message_del_app(id: ids){
                [weak self] status,mess in
                if status == 0{
                    myHUD.showSuccess(mess: mess)
                    self?.myTableView.isEditing = false
                    self?.selectArray = []
                    self?.getCooksData(isDeletALL: true,pageNumber: 1,pageSize: 20,completed: {})
                }
                else {
                    myHUD.showFailed(mess: mess)
                }
            }
            //点击删除后,把编辑button设置为未选中,全选button设置不可见,设置 myTableView为不可编辑
            rightBtn.isSelected = false
            allBtn.isHidden = true
            self.navigationItem.leftBarButtonItems = []
            myTableView.setEditing(false, animated: true)
        }
        else {
            self.view.makeToast("请选择要删除的消息")
        }
        
        
    }
    @objc private func allBtnAction(){
        //设置全选为选中,则title为取消
        allBtn.isSelected = !allBtn.isSelected
        rightBtn.isSelected = allBtn.isSelected
        if allBtn.isSelected {
            let count = self.messageData.count
            var indexArray :[IndexPath] = []
          //获取所有cell的IndexPath
            if count > 0 {
                for i in 0...count - 1{
                    let index = IndexPath(row: i, section: 0)
                    indexArray.append(index)
                }
            }
            selectArray.removeAll()//移除现有选择数组的数据
            selectArray = messageData//将数据源的所有数据赋值给选择数据
            for index in indexArray{
              选中所有的数组
                myTableView.selectRow(at: index, animated: false, scrollPosition: UITableViewScrollPosition.none)
            }
        } else {
          //取消操作,把selectArray为空
            selectArray.removeAll()
            myTableView.setEditing(false, animated: true)//设置为不可编辑
            allBtn.isHidden = true//隐藏
            self.navigationItem.leftBarButtonItems = []//移除删除按钮
        }
    }
    
    // MARK: - Table view data source
    
     func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }
    
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return messageData.count
    }
    
     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true//返回可编辑
    }
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
//这里非常关键!
        return UITableViewCellEditingStyle(rawValue: UITableViewCellEditingStyle.delete.rawValue | UITableViewCellEditingStyle.insert.rawValue)!
    }
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let reuesname = "cell"
        
        var cell = tableView.dequeueReusableCell(withIdentifier: reuesname) as?MESsagneCell
        if cell == nil {
            cell = MESsagneCell(style: UITableViewCellStyle.default, reuseIdentifier: reuesname)
        }
        cell?.title.text = messageData[indexPath.row].title!
        cell?.content.text = messageData[indexPath.row].content!
        cell?.createTime.text = messageData[indexPath.row].createTime!

        
        return cell!
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView.isEditing {
            let select = self.messageData[indexPath.row]
            if (!self.selectArray.contains(select)) {
                self.selectArray.append(select)
                
            }
        }
    }
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let select = self.messageData[indexPath.row]
        if (self.selectArray.contains(select)) {
            let index = selectArray.index(of: select)
            selectArray.remove(at: index!)
        }
    }
}

谢谢,如果写的不好还希望指出,如果恰巧能满足你的需求,请点个喜欢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 昨天跟孩子一起背诵了《与时间赛跑》,课文通过外祖母的去世忧伤不已,后来在爸爸一席话的启示下,和时间赛跑,最后体会到...
    郑彩云_aa1b阅读 136评论 0 2
  • 1.“坚持”两个字一直给我的感觉是在苦苦的支撑,如“再坚持一下就好了”,是的这对于完成一件眼前的事情可以给以支撑,...
    放平自我阅读 256评论 0 0
  • ——坐,食茶 成了大家对潮汕人的既有印象,除了牛肉丸就是功夫茶。 潮汕人不可一日无茶,所以茶...
    木_拾音阅读 1,277评论 2 3
  • 意识恢复的时候,自己正走在一条路上。也有可能不是路,因为四周一片漆黑,什么都看不到,就连自己的身体也看不清,而...
    老三家的老三阅读 330评论 0 3