tableView的编辑

/*

1 UITableViewController继承自UIViewController,自带一个tableView

2 self.view 不仅是UIView而是UITableView

3 datasource和delegate默认都是self(UITableViewController)

4 开发中只需要建立UITableViewController子类,就会帮我们实现dataSource和delegate协议中一些相关的方法,比如tableView编辑(增加 删除 移动),以及多少个分区,每个分区有多少个cell 和返回cell 视图的方法,当你需要的时候只需打开相应的注释就可以了

*/

/*

tableView的编辑步骤:

1. 让TableView处于编辑状态

2. 设置哪些 cell可以编辑

3. 设置编辑的样式(删除 ,插入)

4. 提交编辑操作(1. 先修改数据源  2. 更新UI)

*/

/*

tableView移动的步骤:

1. 让tableView处于编辑状态

2. 设置哪些cell可以移动

3。 提交移动结果(只需要更新数据源即可)

*/

import UIKit

class RootTableViewController: UITableViewController {

//重用标识

let identifier = "cell"

//联系人字典属性  [String: [String]]

var contactSource = ["W":["王哲磊","王浩","王乐","王晨阳"],"C":["陈扬","陈芮"],"B":["边文达","宝音","白靖"],"L":["李玲","刘二蛋","刘婧","刘福宏"]]

//存放排好序的key值

var keysArray:[String]?

override func viewDidLoad() {

super.viewDidLoad()

//取出字典contactArray中的key,

let keys = self.contactSource.keys

//排序后赋值给keysArrray

keysArray = keys.sorted()

// print(keysArray!)

//注册cell

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: identifier)

//1 处于编辑状态

self.navigationItem.rightBarButtonItem = self.editButtonItem

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

// MARK: - Table view data source

//分区个数

override func numberOfSections(in tableView: UITableView) -> Int {

// #warning Incomplete implementation, return the number of sections

//分组的个数 = 字典中键值对的个数

//分组的个数 = 存放排好序key值数组元素个数

return contactSource.count

}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

//先取出排好序key值数组中对应分区的key值

let key = keysArray?[section]

let group = contactSource[key!]

return (group?.count)!

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

//取出字典中key 值对应数组元素的值,赋值给textLabel

//根据分区下标,取出对应位置的key

let key = keysArray?[indexPath.section]

//根据key值取出字典中的value 值

let group = contactSource[key!]

//根据 cell的下标取出数组中对应位置的元素

let name = group?[indexPath.row]

cell.textLabel?.text = name

return cell

}

//添加头部标题

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

return keysArray?[section]

}

//添加索引列表

override func sectionIndexTitles(for tableView: UITableView) -> [String]? {

return keysArray

}

// 编辑

//2 .设置哪些cell可以编辑

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

if indexPath.section < 2{

return true

}

return false

}

//3 设置编辑样式(插入, 删除)

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {

if indexPath.section == 0 {

return .delete

}else if indexPath.section == 1{

return .insert

}

return .none

}

// 4. 提交编辑操作

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

//先取出选中的cell对应的key值

let key = keysArray?[indexPath.section]

//根据key值,取出对应的value值数组

var group = contactSource[key!]

if editingStyle == .delete {

//删除整个分区

if group?.count == 1{

//1.删除字典中的键值对

contactSource.removeValue(forKey: key!)

//2.删除排好序的keyArray数组中元素

keysArray?.remove(at: indexPath.section)

//3.更新UI

let set = NSIndexSet(index: indexPath.section)

tableView.deleteSections(set as IndexSet, with: .left)

}else{

//一条一条哦哦删除cell

//1. 先修改数据源

group?.remove(at: indexPath.row)

//删除之后,重新为字典中的key对应的value赋值

contactSource[key!] = group

//2. 更新UI

tableView.deleteRows(at: [indexPath], with: .fade)

}

} else if editingStyle == .insert {

//准备要插入得到的数据

let name = "逗逼"

//先修改数据源

group?.append(name)

//2重新为contactSource的键值对赋值

contactSource[key!] = group

//3更新UI

tableView.insertRows(at: [indexPath], with: .right)

//4让tableView重新加载数据

self.tableView.reloadData()

}

}

// 设置删除按钮的文字

override func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {

return "删除"

}

// 2.设置哪些cell可以移动

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {

// Return false if you do not want the item to be re-orderable.

return true

}

// Override to support rearranging the table view.

//3. 提交移动结果

override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {

//修改数据源

let key = keysArray?[fromIndexPath.section]

var group = contactSource[key!]

//先取出数组中原位置元素

let name = group?[fromIndexPath.row]

//删除数组中原来位置的元素

group?.remove(at: fromIndexPath.row)

//插入数组中新的位置

group?.insert(name!, at: to.row)

//重新对字典中key值对应的 velue值赋值

contactSource[key!] = group

}

//command + option + /(出来下面的注释)

/// 限制cell跨分区移动

///

/// - Parameters:  参数

///  - tableView:  tableView对象,代理的委托人

///  - sourceIndexPath:  移动之前cell的位置

///  - proposedDestinationIndexPath:  移动之后cell的位置

/// - Returns:  cell移动之后,最终的位置

override func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {

//根据分区的下标判断,是否允许移动,当前后位置在同一分区允许移动,返回值移动之后的位置。当前后的位置不在同一分区,不允许移动,返回之前的位置

if sourceIndexPath.section == proposedDestinationIndexPath.section{

return proposedDestinationIndexPath

}else{

return sourceIndexPath

}

}

/*

// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

// Get the new view controller using segue.destinationViewController.

// Pass the selected object to the new view controller.

}

*/

}

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

推荐阅读更多精彩内容