tableView的編輯

/*

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.

}

*/

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容