1、UITableView 的编辑模式

进入编辑模式
代码体现

// 设置 editing 属性
tableView?.editing = true // 这个设置的时候是有动画效果的
tableView.setEditing(true, animated: true) // 我一般喜欢的设置方式 (写在 btn 或者 item 的监听方法里面)
// 实现编辑模式和非编辑模式的切换
tableView.editing = !tableView.editing
tableView.setEditing(!tableView.editing, animated: true)
@IBAction func editItemAction(sender: AnyObject) {
tableView.editing = !tableView.editing
}
效果图

没有动画效果

 
tableView.editing = !tableView.editing

有动画效果

 
tableView.setEditing(!tableView.editing, animated: true)

2、 设置某一行能够进行编辑

cell 的默认编辑模式是 delete

// Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.
// 单行能够可选的设置编辑
. 设置 tableView 的 editing 属性
. 实现这个方法 // tableView 的某一行能够进行编辑模式
// 这个方法不实现,默认是每一行都进入编辑模式
optional public func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
@IBAction func editItemAction(sender: AnyObject) { tableView.setEditing(!tableView.editing, animated: true)
} // 这是一个数据源方法
// 设置 tableView 那一行进入编辑模式
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { // 双数 row 行进入编辑模式
if indexPath.row % == {
return false
}
return true
}
 
 

3、 设置某一行编辑模式的样式

cell 编辑模式枚举

public enum UITableViewCellEditingStyle : Int {
case None // 正常模式 (这一个主要用于 cell 的移动)
case Delete // 删除模式
case Insert // 插入模式
}
cell 编辑模式设置 // Allows customization of the editingStyle for a particular cell located at 'indexPath'. If not implemented, all editable cells will have UITableViewCellEditingStyleDelete set for them when the table has editing property set to YES.
// 允许用户通过实行这个方法来自定义 cell 的编辑样式, 如果没有实现这个方法, 所有的 cell 的默认编辑样式为 UITableViewCellEditingStyleDelete . 只有 editing 属性设置为 true 的时候才可以看到效果
optional public func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle
代码 /*!
设置某一行的编辑样式
*/
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
let number = indexPath.row %
switch number {
case :
print("")
return UITableViewCellEditingStyle.Delete
case :
print("")
return UITableViewCellEditingStyle.Insert
default:
print("")
return UITableViewCellEditingStyle.None
}
}

效果:

 
 

上部分只是编辑样式的展示

4、 编辑模式的事件回调

@available(iOS 2.0, *)
// 编辑样式 add 和 delete 附加视图点击的回调
optional public func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
默认实现编辑事件回调方法: func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
// 没有添加任何的功能代码
}
实现这个方法后,在非编辑模式下,左滑动 cell 会显示一个 delete 按钮。

效果:

 
 

先进入了编辑模式,查看了每个 cell 的编辑模式的样式。(cell 的编辑模式的设置看上面的代码)
在非编辑模式下,只有 cell 的编辑模式是 delete 的,才可以进行左侧滑。

关于 cell 侧滑功能的实现可以先查看这段代码, 后续后详细说明!

** 事件的回调处理 **
实例代码

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

   switch editingStyle {
case .Delete:
print("Delete")
// 移除模型数据(不移除就会报错)
localData.removeAtIndex(indexPath.row)
// 删除某一行 cell
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) case .Insert:
print("Insert")
let str = "new" + localData[indexPath.row]
// 添加模型数据 (不插入就会报错)
localData.insert(str, atIndex: indexPath.row)
// 这一步只会刷新插入的哪一行
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) case .None:
print("None") // None 样式 是给 cell 的移动准备的,这里永远也不会打印(移动的时候并不需要插入和删除)
}
}
/*!
设置某一行的编辑样式
*/
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { print(#function) let number = indexPath.row %
switch number {
case :
return UITableViewCellEditingStyle.Delete
case :
return UITableViewCellEditingStyle.Insert
default:
// None 样式 是给 cell 的移动准备的
return UITableViewCellEditingStyle.None
}
}

回调效果:

 
 
  1. 进入到编辑模式后,会默认的调用 func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle, 刷新每一行的 cell 编辑样式。
  2. 点击左边的删除按钮,cell 会出现侧滑,显示一个 delete ,只有点击了 delete 之后才可以进行删除。 删除一个 cell 后,会再一次调用 func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle方法,刷新每一个 cell 编辑样式 。(方法调用的个数变少了)
  3. 点击添加按钮,cell 不会出现侧滑, 直接调用回调方法。会再一次调用 func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle 方法,刷新每一个 cell 编辑样式 。(cell 个数增加了)
  4. 当 cell 的编辑样式是 None 的时候, 点击是没有任何效果的。

注意点:
由于进行 delete 和 Insert 操作的回调 func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle 方法。
所以, cell 编辑模式需要用一个 数组来记录。来保证, delete 和 Insert 操作之后,和之前 cell 的编辑样式是对应的。

// 定义一个 空的数组
var cellEditingStyle: [Int] = [] // 设置默认值
for index in ..< localData.count {
cellEditingStyle.append(index)
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
switch editingStyle {
case .Delete:
print("Delete") localData.removeAtIndex(indexPath.row)
// 编辑模式数据删除
cellEditingStyle.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) case .Insert:
print("Insert") localData.insert("new" + localData[indexPath.row], atIndex: indexPath.row)
// 编辑模式数据添加 (设置为 删除)
cellEditingStyle.insert(, atIndex: indexPath.row)
tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) case .None:
print("None") // None 样式 是给 cell 的移动准备的,这里永远也不会打印
}
} func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { print(#function)
// 获取对应的数据进行设置
let number = cellEditingStyle[indexPath.row] %
switch number {
case :
return UITableViewCellEditingStyle.Delete
case :
return UITableViewCellEditingStyle.Insert
default:
return UITableViewCellEditingStyle.None
}
}

使用这种方式

 
 

编辑模式的数据可以和 cell 对应的模型数据绑定。一种 MVC 的思想

5、 编辑模式中的选中操作

编辑模式中的选中操作用到的 API:

// 允许在编辑模式下进行单选
// 默认为 No
public var allowsSelectionDuringEditing: Bool // default is NO. Controls whether rows can be selected when in editing mode // 允许在编辑模式进行多选
// 默认为 No
public var allowsMultipleSelectionDuringEditing: Bool // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode // 当前选中的索引的获取
// 获取当前选中单行的索引
public var indexPathForSelectedRow: NSIndexPath? { get } // returns nil or index path representing section and row of selection.
// 获取当前选中多行的索引
public var indexPathsForSelectedRows: [NSIndexPath]? { get } // returns nil or a set of index paths representing the sections and rows of the selection.

代码演示:

// 进入编辑模式
tableView.editing = !tableView.editing // 编辑模式下单选
tableView.allowsSelectionDuringEditing = true
// 编辑模式下多选
tableView.allowsMultipleSelectionDuringEditing = true

我使用的是 tableView.allowsMultipleSelectionDuringEditing = true 来实现单选和多选操作。
tableView.allowsSelectionDuringEditing = true 效果后面介绍。
这种效果也是我们在项目中最常见的

关键代码
@IBAction func editItemAction(sender: AnyObject) {

    // 非动画
// tableView.editing = !tableView.editing
// tableView.allowsSelectionDuringEditing = !tableView.editing // 在编辑模式下多选
tableView.allowsMultipleSelectionDuringEditing = !tableView.editing // 动画 ( 建议使用这个 )
tableView.setEditing(!tableView.editing, animated: true)
} /* 注释掉这个代码就可实现多选 */
// cell 将要选中的回调代理
// 在这个方法中主要进行的是取消上一次选中
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { // 这个方法第一次调用的时候 indexPath 为 nil
if let selectedRowIndexPath = tableView.indexPathForSelectedRow {
// 去除上一次选中
tableView.deselectRowAtIndexPath(selectedRowIndexPath, animated: true)
}
return indexPath
}

选中效果演示:

 
单选
 
多选操作

当前选中的索引的获取

// 获取当前选中单行的索引
public var indexPathForSelectedRow: NSIndexPath? { get }
// 获取当前选中多行的索引
public var indexPathsForSelectedRows: [NSIndexPath]? { get }

最简单的获取选中 cell 的方式就是下面的两个接口。使用这两个接口,我们就不需要另外的再去定义变量记录选中的 cell 。

tableView.allowsSelectionDuringEditing = true 的特别说明:

这个 tableView.allowsSelectionDuringEditing 设置效果是有点让人疑惑的。在看到多选的效果后,我一直以为 编辑模式下,单选 的效果 和 多选的效果类似,也应该有个 圈圈 事实证明我是错的!
单选和多选的效果:
普通模式下的不能选择,单选和多选:

// 这个属性,默认是 true 的,设置为 false 后,不能进行 cell 的选中操作。
// 同时也禁止了 代理方法选中的回调
tableView.allowsSelection = false

点击 cell 没人任何效果!

 
tableView.allowsSelection = false
tableView.allowsSelection = true
 
tableView.allowsSelection = true
// 多选为 true 后,单选肯定也为 true
tableView.allowsMultipleSelection = true
 
 

编辑模式下的单选:

tableView.editing = true
// 编辑模式下,cell 默认是不能进行选中操作的
tableView.allowsSelectionDuringEditing = false

在编辑模式下,默认 cell 默认是不能响应点击事件的。并且,control view 还是会根据 cell 编辑模式的进行显示(我们看到的加号 ,减号,空白)。

 
tableView.allowsMultipleSelection = false
tableView.editing = true
tableView.allowsSelectionDuringEditing = true

单选是没有 圈圈 效果的,就是单纯的 cell 高亮。并且,control view 还是会根据 cell 编辑模式的进行显示(我们看到的加号 ,减号,空白)。

 
tableView.allowsSelectionDuringEditing = true
tableView.editing = true
tableView.allowsMultipleSelectionDuringEditing = true

多选模式下,会修改 control view 的显示,将 加号,减号,空白替换为 圈圈

 
 

6、 编辑模式中 cell 的 Move (移动操作)

默认情况下tableView 中的 cell 是不能进行移动操作, 只有在编辑模式下,tableView 的 cell 可以进行移动操作。

简单的显示 cell 移动的附加视图

这只是简单的效果显示

// Data manipulation - reorder / moving support
optional public func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) // 进入编辑模式
tableView.editing = !tableView.editing // cell 的移动和排序操作 ( 方法的简单实现)
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { } // 消除不必要的影响
/*!
设置某一行的编辑样式
*/
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { // 获取 cell 对应的编辑模式的缓存数据
let number = cellEditingStyle[indexPath.row] %
switch number { // 注释这里,主要是为了消除,其他功能的影响。
// case 0:
// print("0")
// return UITableViewCellEditingStyle.Delete
// case 1:
// print("1")
// return UITableViewCellEditingStyle.Insert default:
print("")
// 这一个模式是用来排序移动准备用的
return UITableViewCellEditingStyle.None
}
}

效果:

 
 

7、 编辑模式中指定某一行 cell 可以 Move

// 指定哪一个 cell 能够移动
func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { // 单数 row 行进入可移动模式
if indexPath.row % == {
return false
}
return true
}

效果:

 
 

3、tableView 的移动和排序

// Moving/reordering

// Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:
// 允许某一行的排序的附加视图显示,只用在数据源 实现了 -tableView:moveRowAtIndexPath:toIndexPath: 方法的时候 这个方法才有效
@available(iOS 2.0, *)
optional public func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool
传说中支持移动和排序的方法 // Data manipulation - reorder / moving support @available(iOS 2.0, *)
optional public func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath)
代码体现 // cell 的移动和排序操作
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { } // 指定哪一个 cell 能够移动
func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { // 单数 row 行进入可移动模式
if indexPath.row % == {
return false
}
return true
}

效果图

 
 

4、tableView 索引设置

// Index

@available(iOS 2.0, *)
// 通过实行这个方法,返回一个 string 的数组就可以设置索引
optional public func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? // return list of section titles to display in section index view (e.g. "ABCD...Z#")
@available(iOS 2.0, *)
// 索引选中的回调
optional public func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int // tell table which section corresponds to section title/index (e.g. "B",1))
单独设置索引 // 索引设置
func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
return ["A","B","C","D","E", "F", "G"]
}

效果图

 
 

当只实行单独设置索引的方法,点击索引会默认的滚动到索引对应顺序的组。

// 索引设置
func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
return ["A","B","C","D","E", "F", "G"]
} // 告诉表部分对应部分标题/索引(当点击索引的时候回调用这个方法)
/*
实现这个方法,点击索引的只会滚动一次,滚动后执行的是索引的回调
*/
func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
print(title , index)
return 3
}

链接:https://www.jianshu.com/p/aaf2c88c58f0

UITableView编辑模式大全解的更多相关文章

  1. IOS第七天(6:UiTableView编辑模式, 拖动位置 ,滑动删除)

    **********UiTableView编辑模式, 拖动位置 ,滑动删除 #import "HMViewController.h" @interface HMViewContro ...

  2. UITableView 编辑模式(增加-删除-移动---自定义左滑 title)

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  3. UITableView编辑模式

    UITableView有两种模式,普通模式和编辑模式.在编辑模式下可以对cell进行排序.删除.插入等等. 如何进入编辑模式 调用tableView的setEditing(editing: Bool, ...

  4. UITableView 编辑模式(增加-删除-移动---自定义左滑 title) xib cell

    参考:  http://www.open-open.com/lib/view/open1430008922468.html - (void)viewDidLoad { [super viewDidLo ...

  5. easyui-datagrid 编辑模式详解——combobox

    用于列表显示号了,需要改动某一列的值,而且根据每一行的数据去加载data数据,放在这个列中供别人选择 //-------------------- 代码可变区//---------- 数据定义区var ...

  6. easyui datagrid 编辑模式详解

       一,建立编辑器 从api得知,扩展一种新的编辑器类型,需要提供以上几个方法.项目中正好需要一个checkbox 类型编辑器,但在easyui中并没提供这样的编辑器,那我们可以通过扩展编辑器来解决 ...

  7. UITableView的编辑模式

    UITableView可以分普通模式和Editing模式两种,这里我们着重讨论Editing模式,Editing模式中又分三种操作:Insert.Delete. Reallocted.Insert和D ...

  8. 让UITableView进入编辑模式

    1.UITableView对象有一个editing属性,设为YES时,该对象会进入编辑模式(editing mode).表格视图进入编辑模式后,用户可以管理表格中得行,如改变行的排列顺序.增加行或删除 ...

  9. iPhone应用开发 UITableView学习点滴详解

    iPhone应用开发 UITableView学习点滴详解是本文要介绍的内容,内容不多,主要是以代码实现UITableView的学习点滴,我们来看内容. -.建立 UITableView DataTab ...

随机推荐

  1. 使用vue-cli搭建vue项目

    1.安装node环境,然后在命令行输入node -v 和npm -v 查看版本号 2.在正式开始项目之前我们先介绍一下vue-cli,vue-cli是一个脚手架工具,vue-cli是帮助我们写好vue ...

  2. pytthon—day8 读写模式的结合、文件操作模式、with完成文本文件复制、游标操作

    一.读写模式的结合 w:写指没有新建文件,有文件就清空 w=open('1.txt','w',encoding='utf-8') w.write('000\n') 在写入数据时,需要及时处理内存空间, ...

  3. 【Spark篇】---Spark故障解决(troubleshooting)

    一.前述 本文总结了常用的Spark的troubleshooting. 二.具体 1.shuffle file cannot find:磁盘小文件找不到. 1) connection timeout ...

  4. HBase篇--初始Hbase

    一.前述 1.HBase,是一个高可靠性.高性能.面向列.可伸缩.实时读写的分布式数据库.2.利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量 ...

  5. .NET Core WebApi中实现多态数据绑定

    什么是多态数据绑定? 我们都知道在ASP.NET Core WebApi中数据绑定机制(Data Binding)负责绑定请求参数, 通常情况下大部分的数据绑定都能在默认的数据绑定器(Binder)中 ...

  6. 微信小程序与AspNetCore SignalR聊天实例

    微信小程序与aspnetcore signalr实例 本文不对小程序与signalr做任何介绍,默认读者已经掌握 aspnetcore Signalr文档 小程序文档 写在之前 SignalR没有提供 ...

  7. putty 默认颜色样式修改 for windows

    一.导出 putty 注册表默认配置文件 1.1 打开注册表:运行 --» regedit 找到 putty 注册表文件: [HKEY_CURRENT_USER\Software\SimonTatha ...

  8. JS引擎线程的执行过程的三个阶段(二)

    继续JS引擎线程的执行过程的三个阶段(一) 内容, 如下: 三. 执行阶段 1. 网页的线程 永远只有JS引擎线程在执行JS脚本程序,其他三个线程只负责将满足触发条件的处理函数推进事件队列,等待JS引 ...

  9. [转]C# 实现Jwt bearer Authentication

    本文转自:https://www.cnblogs.com/aishangyipiyema/p/9262642.html 什么是JWT JWT(JSON Web Token), 顾名思义就是在Web上以 ...

  10. JQuery官方学习资料(译):CSS

        JQuery提供了一个处理方法,可以获取或设置元素的CSS属性. // 获取 CSS 属性 $( "h1" ).css( "fontSize" ); / ...