美文网首页
tableView的编辑

tableView的编辑

作者: 摇耳朵的小布丁i | 来源:发表于2016-11-29 11:47 被阅读0次

/*

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.

}

*/

}

相关文章

网友评论

      本文标题:tableView的编辑

      本文链接:https://www.haomeiwen.com/subject/timapttx.html