Swift tableView的单元格多选功能的实现(获取多选值、多选删除)

有时候在我们应用中需要用到表格(tableView)的多选功能。其实 tableView 已自带了多种多选功能,不用借助第三方组件也可以实现。下面分别进行介绍。

方法1,自定义一个数组保存选中项的索引(非编辑状态)

(1)我们先定义一个数组,表格在非编辑状态时,点击某个单元格便将其索引添加到这个数组中。同时将单元格尾部打勾表示选中状态。再次点击原来选中的单元格,则取消选中状态,并将索引从数组中移除。

(2)点击导航栏上的“确定”按钮,即可获取到所有选中项的索引以及对应的值,并打印出来。

 


import UIKit
 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var items:[String] = ["条目1","条目2","条目3","条目4","条目5"]
    
    //存储选中单元格的索引
    var selectedIndexs = [Int]()
    
    var tableView:UITableView?
    
    override func loadView() {
        super.loadView()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建表视图
        self.tableView = UITableView(frame: self.view.frame, style:UITableViewStyle.Plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.registerClass(UITableViewCell.self,
                                      forCellReuseIdentifier: "SwiftCell")
        self.view.addSubview(self.tableView!)
    }
    
    //在本例中,只有一个分区
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    
    //返回表格行数(也就是返回控件数)
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }
    
    //创建各单元显示内容(创建参数indexPath指定的单元)
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCell
    {
        //为了提供表格显示性能,已创建完成的单元需重复使用
        let identify:String = "SwiftCell"
        //同一形式的单元格重复使用,在声明时已注册
        let cell = tableView.dequeueReusableCellWithIdentifier(identify,
                                forIndexPath: indexPath) as UITableViewCell
        
        cell.textLabel?.text = self.items[indexPath.row]
        
        //判断是否选中(选中单元格尾部打勾)
        if selectedIndexs.contains(indexPath.row) {
            cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        } else {
            cell.accessoryType = UITableViewCellAccessoryType.None
        }
        
        return cell
    }
    
    // UITableViewDelegate 方法,处理列表项的选中事件
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
        //判断该行原先是否选中
        if let index = selectedIndexs.indexOf(indexPath.row){
            selectedIndexs.removeAtIndex(index) //原来选中的取消选中
        }else{
            selectedIndexs.append(indexPath.row) //原来没选中的就选中
        }
        
        ////刷新该行
        self.tableView?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    }
 
    //确定按钮点击
    @IBAction func btnClick(sender: AnyObject) {
        print("选中项的索引为:", selectedIndexs)
        print("选中项的值为:")
        for index in selectedIndexs {
            print(items[index])
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

方法2,将allowsMultipleSelection设置为true(非编辑状态)

前面的样例,表格实际上还是单选的。只不过我们定义了一个数值来保存选中的单元格索引,从而实现多选的功能。

下面还是实现同样的功能,只不过这次将表格设置成允许多选(allowsMultipleSelection 为 true),这样我们也就不用再另外定义数组来存储选中项索引了。

 


import UIKit
 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var items:[String] = ["条目1","条目2","条目3","条目4","条目5"]
    
    var tableView:UITableView?
    
    override func loadView() {
        super.loadView()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建表视图
        self.tableView = UITableView(frame: self.view.frame, style:UITableViewStyle.Plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.registerClass(UITableViewCell.self,
                                      forCellReuseIdentifier: "SwiftCell")
        self.view.addSubview(self.tableView!)
        
        //设置允许单元格多选
        self.tableView!.allowsMultipleSelection = true
    }
    
    //在本例中,只有一个分区
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    
    //返回表格行数(也就是返回控件数)
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }
    
    //创建各单元显示内容(创建参数indexPath指定的单元)
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCell
    {
        //为了提供表格显示性能,已创建完成的单元需重复使用
        let identify:String = "SwiftCell"
        //同一形式的单元格重复使用,在声明时已注册
        let cell = tableView.dequeueReusableCellWithIdentifier(identify,
                                forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = self.items[indexPath.row]
        return cell
    }
    
    //处理列表项的选中事件
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
        let cell = self.tableView?.cellForRowAtIndexPath(indexPath)
        cell?.accessoryType = .Checkmark
    }
    
    //处理列表项的取消选中事件
    func tableView(tableView: UITableView,
                   didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = self.tableView?.cellForRowAtIndexPath(indexPath)
        cell?.accessoryType = .None
    }
 
    //确定按钮点击
    @IBAction func btnClick(sender: AnyObject) {
        var selectedIndexs = [Int]()
        
        if let selectedItems = tableView!.indexPathsForSelectedRows {
            for indexPath in selectedItems {
                selectedIndexs.append(indexPath.row)
            }
        }
        
        print("选中项的索引为:", selectedIndexs)
        print("选中项的值为:")
        for index in selectedIndexs {
            print(items[index])
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

方法3,allowsMultipleSelectionDuringEditing设置为true(编辑状态)
这个样例同上面那个有点类似,只不过是表格进入编辑状态下才可以多选。
(1)下面样例表格默认情况下无法进行多选。
(2)长按表格进入编辑状态,这时单元格前面会出现选择框。点击即可进行单元格的选择与取消。
(3)点击导航栏上的“删除”按钮,即可将选中的单元格都删除。

 


 

import UIKit
 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,
                    UIGestureRecognizerDelegate {
    
    var items:[String] = ["条目1","条目2","条目3","条目4","条目5"]
    
    var tableView:UITableView?
    
    override func loadView() {
        super.loadView()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //创建表视图
        self.tableView = UITableView(frame: self.view.frame, style:UITableViewStyle.Plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.registerClass(UITableViewCell.self,
                                      forCellReuseIdentifier: "SwiftCell")
        self.view.addSubview(self.tableView!)
        
        //表格在编辑状态下允许多选
        self.tableView?.allowsMultipleSelectionDuringEditing = true
        
        //绑定对长按的响应
        let longPress =  UILongPressGestureRecognizer(target:self,
                        action:#selector(ViewController.tableviewCellLongPressed(_:)))
        //代理
        longPress.delegate = self
        longPress.minimumPressDuration = 1.0
        //将长按手势添加到需要实现长按操作的视图里
        self.tableView!.addGestureRecognizer(longPress)
    }
    
    //单元格长按事件响应
    func tableviewCellLongPressed(gestureRecognizer:UILongPressGestureRecognizer)
    {
        if (gestureRecognizer.state == UIGestureRecognizerState.Ended)
        {
            print("UIGestureRecognizerStateEnded");
            //在正常状态和编辑状态之间切换
            if(self.tableView!.editing == false) {
                self.tableView!.setEditing(true, animated:true)
            }
            else {
                self.tableView!.setEditing(false, animated:true)
            }
        }
    }
    
    //在本例中,只有一个分区
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    
    //返回表格行数(也就是返回控件数)
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }
    
    //创建各单元显示内容(创建参数indexPath指定的单元)
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCell
    {
        //为了提供表格显示性能,已创建完成的单元需重复使用
        let identify:String = "SwiftCell"
        //同一形式的单元格重复使用,在声明时已注册
        let cell = tableView.dequeueReusableCellWithIdentifier(identify,
                                            forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = self.items[indexPath.row]
        return cell
    }
    
    //删除按钮点击
    @IBAction func btnClick(sender: AnyObject) {
        //获取选中项索引
        var selectedIndexs = [Int]()
        if let selectedItems = tableView!.indexPathsForSelectedRows {
            for indexPath in selectedItems {
                selectedIndexs.append(indexPath.row)
            }
        }
        
        //删除选中的数据
        items.removeAtIndexes(selectedIndexs)
        //重新加载数据
        self.tableView?.reloadData()
        //退出编辑状态
        self.tableView!.setEditing(false, animated:true)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
 
extension Array {
    //Array方法扩展,支持根据索引数组删除
    mutating func removeAtIndexes(ixs: [Int]) {
        for i in ixs.sort(>) {
            self.removeAtIndex(i)
        }
    }
}

 

时间: 2024-09-20 06:11:16

Swift tableView的单元格多选功能的实现(获取多选值、多选删除)的相关文章

c1flexgrid-C1FlexGrid 用户在界面编辑grid的单元格之后点击保存按钮但编辑的值并未保存。

问题描述 C1FlexGrid 用户在界面编辑grid的单元格之后点击保存按钮但编辑的值并未保存. 求解! C1FlexGrid界面修改单元格值后直接点击保存按钮,该值没有被保存进来-- 这个问题有谁遇到过? 请问怎样解决?或者是编辑后该值被存储在某个地方,怎样获取?请大牛们进来看看,多多指点! 解决方案 这个问题解决了,呵呵-- 希望可以帮到其他的友友~ 方法:点击保存时,在保存中添加代码:将焦点赋给该grid,问题解决~

运用Excel单元格边界附加功能

在Excel中用户时常要和单元格.行.列打交道.但你是否还注意过Excel单元格的边界呢?你充分利用了Excel在这些边界上提供的附加功能吗? 这里我们首先拿"列"开刀.默认情况下,Excel的列宽限定为一定长度的字符串宽度.如果你在单元格填入的是数字,且数字位数不多于十一个,相应单元格的宽度就会自动适应数字长度,将它全部显示出来.3yz下载站提醒你当你输入第十二位数字的时候,单元格将会以科学计数法将格内数字显示出来.这里只要单元格内数字位数不超过三十,其宽度都可以自动适应. 但对于字

Excel单元格边界附加功能使用技巧

在Excel中用户时常要和单元格.行.列打交道.但你是否还注意过Excel单元格的边界呢?你充分利用了Excel在这些边界上提供的附加功能吗? 这里我们首先拿"列"开刀.默认情况下,Excel的列宽限定为一定长度的字符串宽度.如果你在单元格填入的是数字,且数字位数不多于十一个,相应单元格的宽度就会自动适应数字长度,将它全部显示出来.3yz下载站提醒你当你输入第十二位数字的时候,单元格将会以科学计数法将格内数字显示出来.这里只要单元格内数字位数不超过三十,其宽度都可以自动适应. 但对于字

excel 单元格保护锁定功能在哪 Excel2010保护锁定单元格的方法

打开Excel 2010,选中任意一个单元格,鼠标右键,打开的菜单选择"设置单元格格式"命令 切换到"保护"选项卡,在这里我们可以看到默认情况下"锁定"复选框是被勾上的,也就是说一旦锁定了工作表,所有的单元格也就锁定了. 按Ctrl+A快捷键选中所有单元格,接着再鼠标右键单击"设置单元格格式",切换到"保护"选项卡,把"锁定"前面的小方框去勾,单击"确定"按钮保存设置

jQuery实现HTML表格单元格的合并功能_jquery

本文实例讲述了jQuery实现HTML表格单元格合并的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 合并前: 合并后: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.

怎样锁定Ext EditorGridPanel单元格编辑功能

问题描述 大家好!我想请问下有没有童鞋知道怎样锁定EditorGridPanel表格单元格的编辑功能:Extjs版本:3.2.1 具体描述:      表格第一列(其它列也行)为类型选择列,采用ComboBox为编辑器,当选择某一类型(如:类型1)时表格当前行的某些列(如:第2列~第4列)就变为不可编辑状态,并显示不同的样式(类似于button的disable).       当选择其它类型(如:类型2)时表格当前行的不可编辑单元格又变成可编辑的.如下图: 我的实现思路:     当选择某一行的

Excel 2007单元格批注功能使用教程

1.隐藏单元格批注 在Excel2007中为了能够随单元格一起显示或隐藏批注,可以选择包含批注的单元格,然后单击"审阅"选项卡上"批注"组中的"显示/隐藏批注",如图1所示. 提示:如果当前状态为显示,单击则变为隐藏,再单击则为显示. 图1 显示/隐藏批注(单击这里) 2.编辑单元格批注 首先,单击包含要编辑的批注的单元格;接着,在"审阅"选项卡上的"批注"组中,单击"编辑批注",如图2

Excel单元格背景设置为灰色并锁定

如图,实现如下的功能,背景为灰色,并且,锁定相应的单元格不给修改. 设灰色 1. CTRL+A(全选) 2. 右键-设置单元格格式-图案-灰色 3. 鼠标拉选出想要的单元格 4. 右键-设置单元格格式-图案-无颜色 锁定单元格 1. 全选表格,格式-单元格-保护,去掉锁定那个勾 2. 选中要保护的单元格,格式-单元格-保护,勾上锁定那个勾 3. 最后,工具-保护-保护工作表(可设置密码) 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.

Excel单元格中条件格式的技巧

 对于Excel表格中的不同数据,我们可以按照不同的条件和要求设置它显示的格式,以便把不同的数据更加醒目地表示出来,这就是Excel单元格中条件格式的应用.也就是说,我们可以根据单元格中数据所满足的不同条件为单元格设置不同的格式.那么,如果我们希望某单元格的格式根据其他单元格数据所满足的条件来进行相应设置,能不能实现呢?当然能,在Excel 2007中,用条件格式同样可以让这种希望变成现实. 考试号在A列,总分成绩在G列,毕业学校则在H列,各科成绩分布在C至F列,现在我们根据指定的条件为相应单元