/*
1 UITableViewController繼承自UIViewController,自帶一個tableView
2 self.view 不僅是UIView而是UITableView
3 datasource和delegate默認都是self(UITableViewController)
4 開發(fā)中只需要建立UITableViewController子類,就會幫我們實現(xiàn)dataSource和delegate協(xié)議中一些相關(guān)的方法,比如tableView編輯(增加 刪除 移動),以及多少個分區(qū),每個分區(qū)有多少個cell 和返回cell 視圖的方法,當你需要的時候只需打開相應(yīng)的注釋就可以了
*/
/*
tableView的編輯步驟:
1. 讓TableView處于編輯狀態(tài)
2. 設(shè)置哪些 cell可以編輯
3. 設(shè)置編輯的樣式(刪除 ,插入)
4. 提交編輯操作(1. 先修改數(shù)據(jù)源? 2. 更新UI)
*/
/*
tableView移動的步驟:
1. 讓tableView處于編輯狀態(tài)
2. 設(shè)置哪些cell可以移動
3。 提交移動結(jié)果(只需要更新數(shù)據(jù)源即可)
*/
import UIKit
class RootTableViewController: UITableViewController {
//重用標識
let identifier = "cell"
//聯(lián)系人字典屬性? [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 處于編輯狀態(tài)
self.navigationItem.rightBarButtonItem = self.editButtonItem
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
//分區(qū)個數(shù)
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
//分組的個數(shù) = 字典中鍵值對的個數(shù)
//分組的個數(shù) = 存放排好序key值數(shù)組元素個數(shù)
return contactSource.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//先取出排好序key值數(shù)組中對應(yīng)分區(qū)的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 值對應(yīng)數(shù)組元素的值,賦值給textLabel
//根據(jù)分區(qū)下標,取出對應(yīng)位置的key
let key = keysArray?[indexPath.section]
//根據(jù)key值取出字典中的value 值
let group = contactSource[key!]
//根據(jù) cell的下標取出數(shù)組中對應(yīng)位置的元素
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 .設(shè)置哪些cell可以編輯
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if indexPath.section < 2{
return true
}
return false
}
//3 設(shè)置編輯樣式(插入, 刪除)
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對應(yīng)的key值
let key = keysArray?[indexPath.section]
//根據(jù)key值,取出對應(yīng)的value值數(shù)組
var group = contactSource[key!]
if editingStyle == .delete {
//刪除整個分區(qū)
if group?.count == 1{
//1.刪除字典中的鍵值對
contactSource.removeValue(forKey: key!)
//2.刪除排好序的keyArray數(shù)組中元素
keysArray?.remove(at: indexPath.section)
//3.更新UI
let set = NSIndexSet(index: indexPath.section)
tableView.deleteSections(set as IndexSet, with: .left)
}else{
//一條一條哦哦刪除cell
//1. 先修改數(shù)據(jù)源
group?.remove(at: indexPath.row)
//刪除之后,重新為字典中的key對應(yīng)的value賦值
contactSource[key!] = group
//2. 更新UI
tableView.deleteRows(at: [indexPath], with: .fade)
}
} else if editingStyle == .insert {
//準備要插入得到的數(shù)據(jù)
let name = "逗逼"
//先修改數(shù)據(jù)源
group?.append(name)
//2重新為contactSource的鍵值對賦值
contactSource[key!] = group
//3更新UI
tableView.insertRows(at: [indexPath], with: .right)
//4讓tableView重新加載數(shù)據(jù)
self.tableView.reloadData()
}
}
// 設(shè)置刪除按鈕的文字
override func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "刪除"
}
// 2.設(shè)置哪些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. 提交移動結(jié)果
override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
//修改數(shù)據(jù)源
let key = keysArray?[fromIndexPath.section]
var group = contactSource[key!]
//先取出數(shù)組中原位置元素
let name = group?[fromIndexPath.row]
//刪除數(shù)組中原來位置的元素
group?.remove(at: fromIndexPath.row)
//插入數(shù)組中新的位置
group?.insert(name!, at: to.row)
//重新對字典中key值對應(yīng)的 velue值賦值
contactSource[key!] = group
}
//command + option + /(出來下面的注釋)
/// 限制cell跨分區(qū)移動
///
/// - Parameters:? 參數(shù)
///? - tableView:? tableView對象,代理的委托人
///? - sourceIndexPath:? 移動之前cell的位置
///? - proposedDestinationIndexPath:? 移動之后cell的位置
/// - Returns:? cell移動之后,最終的位置
override func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {
//根據(jù)分區(qū)的下標判斷,是否允許移動,當前后位置在同一分區(qū)允許移動,返回值移動之后的位置。當前后的位置不在同一分區(qū),不允許移動,返回之前的位置
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.
}
*/
}