如何從UITableView中刪除一行?
?
在創(chuàng)建Simple Table 應(yīng)用程序時(shí),經(jīng)常有人提到上述問(wèn)題,
?
在開(kāi)始編碼之前,我先介紹下 Model-View-Controller 模式,這個(gè)模式是在用戶界面編程中經(jīng)常引用的設(shè)計(jì)模式之一。
?
1.理解 Model-View-Controller
?
不管學(xué)習(xí)什么語(yǔ)言,成為一個(gè)更好的開(kāi)發(fā)人員所需要了解的概念是Separation ?of Concerns (SoC , 關(guān)注點(diǎn)分離).
?
這個(gè)概念很簡(jiǎn)單,關(guān)注點(diǎn)是軟件功能的不同方面,這個(gè)概念是鼓勵(lì)開(kāi)發(fā)人員將一個(gè)大的功能或程序分為幾個(gè)關(guān)注點(diǎn)區(qū)域,每個(gè)區(qū)域都有自己的職責(zé)。在iOS編程中經(jīng)常發(fā)現(xiàn)的委托模式(delegate pattern),也是SoC模式的一個(gè)例子。
?
這里的MVC模式是另一個(gè)SoC的范例。MVC的核心思想是分離用戶界面為3個(gè)區(qū)域,每一個(gè)區(qū)域負(fù)責(zé)特定的功能。如果MVC名字上暗示了一樣,MVC將用戶界面分為3個(gè)部分:
?
Model - 模型負(fù)責(zé)保存數(shù)據(jù)和數(shù)據(jù)上的操作。模型可以很簡(jiǎn)單,如一個(gè)數(shù)組對(duì)象存放所有的表數(shù)據(jù)。新增、編輯和更新是數(shù)據(jù)操作方法。實(shí)際上,操作方法經(jīng)常認(rèn)為是業(yè)務(wù)邏輯(Businsess Rules).
?
View - 視圖管理信息的可視化顯示,例如,UITableView 以表示圖格式顯示信息
?
Controller - 控制器是Model 和 View 之間的橋梁,負(fù)責(zé)轉(zhuǎn)換視圖中用戶交互(如輕拍操作)為執(zhí)行模型中的合適方法。例如,用戶輕拍了視圖中的一個(gè)刪除按鈕,相應(yīng)的,控制器出發(fā)模型中刪除操作方法。隨后,在要求視圖更新自己,并反應(yīng)出數(shù)據(jù)模型的更新。
?
2.如何從UITableView 中刪除行數(shù)據(jù)
?
我們有3項(xiàng)工作要做:
?
1)編寫代碼,切換到編輯模式,實(shí)現(xiàn)行刪除
2)從模型中刪除相應(yīng)的表數(shù)據(jù)項(xiàng)
3)再次加載表視圖,以便反映出表數(shù)據(jù)的變化
?
?
1)編寫代碼,切換到編輯模式,實(shí)現(xiàn)行刪除
在iOS App中,用戶通過(guò)劃過(guò)一行,初始化刪除按鈕?;叵胍幌?,我們使用了UITableViewDataSource協(xié)議,可參考API文檔,其中有一個(gè)方法:
?
tableView:commitEditStyle:forRowAtIndexPath.當(dāng)用戶劃過(guò)一行時(shí),表視圖將檢查該方法釋放實(shí)現(xiàn)。如果發(fā)現(xiàn)該方法,表視圖將自動(dòng)顯示刪除按鈕。
?
即便該方法是空的,并沒(méi)有執(zhí)行任何操作,當(dāng)你劃過(guò)一行時(shí),仍然可以看到刪除按鈕。
2)從模型中刪除相應(yīng)的表數(shù)據(jù)項(xiàng)
?
接下來(lái)的工作是添加代碼到該方法中,刪除實(shí)際的表數(shù)據(jù)。和其它表視圖方法一樣,它傳入indexPath 參數(shù),告訴你需要?jiǎng)h除的行號(hào)(row number),因此,你可以使用這一信息,從表數(shù)組中刪除對(duì)應(yīng)的元素。
?
在Simple Table 應(yīng)用程序中,我們使用NSArray 數(shù)組來(lái)存放表數(shù)據(jù)(也就是模型)。問(wèn)題是NSArray 是不可編輯的,也就是在數(shù)組初始化之后,你無(wú)法添加、刪除其內(nèi)容??蛇x辦法是,我們將使用NSMutableArray 代替 NSArray,
?
NSMutableArray 提供了新增和刪除操作方法:
?
@implementation SimpleTableViewController
{
NSMutableArray *tableData;
}
?
在tableView:commitEditStyle方法中,添加如下代碼,從數(shù)據(jù)中刪除實(shí)際的數(shù)據(jù)。代碼如下:
?
?
- ( void )tableView:( UITableView *)tableView commitEditingStyle:( UITableViewCellEditingStyle )editingStyle forRowAtIndexPath:( NSIndexPath *)indexPath
{
? ? //Remove the row from data model
? ? [ tableData removeObjectAtIndex :indexPath. row ];
?
}
?
NSMutableArray 提供了一些方法用來(lái)操作數(shù)組的內(nèi)容。這里,我們使用removeObjectAtIndex 方法從數(shù)組中刪除特定項(xiàng),并刪除一行。悲催,App并沒(méi)有按預(yù)期工作。
?
這并不是bug。App確實(shí)從數(shù)組中刪除了該數(shù)據(jù)項(xiàng)。已刪除的數(shù)據(jù)項(xiàng)仍然出現(xiàn)在視圖中的原因是視圖沒(méi)有刷新,無(wú)法反應(yīng)出數(shù)據(jù)模型的更新。
?
3)再次加載表視圖,以便反映出表數(shù)據(jù)的變化
?
因此,一旦底層的數(shù)據(jù)刪除了,我們需要調(diào)用reloadData方法,要求表視圖刷新,如下是更新之后的代碼:
?
- ( void )tableView:( UITableView *)tableView commitEditingStyle:( UITableViewCellEditingStyle )editingStyle forRowAtIndexPath:( NSIndexPath *)indexPath
{
? ? //Remove the row from data model
? ? [ tableData removeObjectAtIndex :indexPath. row ];
?
? ? //Request table view to reload
? ? [tableView reloadData ];
?
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
