IOS編程教程(九):從UITableView刪除一行與Model-View-Controls模型


“刪除行”特色圖片正如在以前的帖子,但是我在轉到故事版(StoryBoard)教程之前,我有另外一個問題來回答。

我如何從UITableView刪除一行呢?

當人們構建簡單的表視圖引用程序后,這是另一個常見的​​問題。同樣的,它比你想象的更容易。但在進入編碼部分,我打算給你介紹一個程序員使用最多的設計模式,用戶界面​​編程的模型 - 視圖 - 控制器模式(Model-View-Controller)。

如果你是認真對待iOS編程的話,你無法逃避學習模型 - 視圖 - 控制器(MVC)。除了iOS編程,MVC也常用在其他編程語言如Java,C#。如果你有其他編程背景,MVC對你來說就不是新的了。

理解模型-視圖-控制器(MVC)

對於MVC的核心想法,到后來的框架中最有影響力的,就是我所說的關注點分離。關注點分離背后的想法是做出了清晰分離的域對象模型,他們是我們對現實世界的看法,並抽象為對象,最后在屏幕上轉換為我們看到的圖形用戶界面元素。域對象應該是完全獨立的,與外部界面完全分離,他們也應該能夠支持多個界面,可能同時。這種方法是Unix文化的重要組成部分,並一直延續至今許多通過一個圖形界面和命令行界面進行操作的程序。

Martin Fowler

不管你學什么計算機語言,一個重要的概念,讓你成為一個更好的程序員的是關注點分離(SoC)。這個概念是相當簡單的,關注軟件功能的不同方面。這種概念,鼓勵開發人員將一個大的功能或程序分為對多個區域的關注,每個地區都有自己的責任。我們在前面的教程中解釋的委托模式通常被作為在iOS編程的一個SOC的例子。

在這里,模型 - 視圖 - 控制器的SoC是另一個例子。MVC的核心思想是明確分開的用戶界面分為三個區域(或對象組),每個區域負責的特定功能。正如它的名字所暗示的,MVC將用戶界面分為三個部分:

模型 -模型是負責用於控制數據或任何對象對數據的操作。該模型可以作為一個數組對象,它存儲所有的表格數據並實現添加,編輯和刪除的操作實例。在現實中,這些操作通常被稱為業務規則。

視圖 -視圖管理信息的可視化顯示。例如,UITableView中顯示的信息在表視圖格式。

控制器 -控制器是模型和視圖之間的橋梁。它轉換成適當的行為,在模型中進行用戶交互的視圖(如TAP)。例如,用戶點擊刪除按鈕在視圖和控制器,進而觸發了在模型中的刪除操作。之后,申請視圖刷新自己的數據模型來反映更新。

為了更好地幫助你理解MVC,讓我們使用簡單的表應用程序作為一個例子。該應用程序會顯示一個列表的表視圖。如果你把概念轉化為可視化表示,這里表示數據如何的表中顯示:

MVC模式的簡單表

以MVC模式為例說明了如何使用簡單的表

菜單的信息都存儲在單獨的數組對象模型中每個表行映射元素的菜單陣列。UITableView的對象是被用戶所看到的界面視圖它負責所有的視覺效果(例如顏色表中的行,字體大小和類型)。TableViewController作為的TableView和菜單數據模型之間的橋梁。顯示數據的時候,UITableView實際上請求Controller提供數據,Controller就從Model中得到數據.

如何從UITableView刪除行

我希望你對模型 - 視圖 - 控制器有一個更好的了解。現在,讓我們繼續前進到編碼部分,看看我們如何能夠從UITableView中刪除行。為了讓事情變得簡單,我將使用簡單的表的應用程序作為一個例子。

如果你完全理解MVC模式,你可能對如何實現刪除行有一些想法。有三個主要的事情是我們需要做的:

1。編寫代碼以切換到編輯模式的行刪除
2。從模型中刪除行
3 返回相應的表中的數據刷新表視圖,以反映表數據的變化

1.編寫代碼切換到編輯模式的行刪除

在iOS應用程序中,用戶通常使用一個“刪除”按鈕來處理行刪除。回想我們以前的程序,我們采用了UITableViewDataSource協議,如果你看過API文檔,還有一種方法名為:commitEditingStyle:forRowAtIndexPath當用戶在一行上向左或向右滑動時,表視圖檢查看是否已經實現該方法。如果實現該方法,表視圖會自動顯示“刪除”按鈕。

只需添加以下代碼到您的表視圖的應用程序,並運行您的應用程序:

1
2
3
4
-   ( void )tableView : (UITableView   * )tableView commitEditingStyle : (UITableViewCellEditingStyle )editingStyle forRowAtIndexPath : ( NSIndexPath   * )indexPath
{

}

 

即使方法是空的,不執行任何操作,你在行上左右滑動時的時候,你會看到“刪除”按鈕。

刷卡刪除表行

左右滑動刪除表中的行

2.從模型中刪除相應表中數據

接下來的事情就是將代碼添加到方法中來刪除實際表中的數據。像其他表視圖方法一樣,它把indexPath作為參數,來告訴你刪除的行號。所以,你可以利用這些信息,來刪除相應的數組元素。

簡單表格應用程序的源代碼中,我們使用NSArray的存儲表數據(模型)。NSArray的問題是它的不可編輯的。也就是說,數組一旦被初始化你不能添加/刪除其內容。因此,我們將改變NSArray為NSMutableArray,它增加了插入和刪除操作:

1
2
3
4
5
6
7
8
9
10
11
@implementation  SimpleTableViewController
{
     NSMutableArray   *tableData;
}

-   ( void )viewDidLoad
{
     [super viewDidLoad ];
     // Initialize table data
    tableData   =   [ NSMutableArray  arrayWithObjects : @ "Egg Benedict",   @ "Mushroom Risotto",   @ "Full Breakfast",   @ "Hamburger",   @ "Ham and Egg Sandwich",   @ "Creme Brelee",   @ "White Chocolate Donut",   @ "Starbucks Coffee",   @ "Vegetable Curry",   @ "Instant Noodle with Egg",   @ "Noodle with BBQ Pork",   @ "Japanese Noodle with Pork",   @ "Green Tea",   @ "Thai Shrimp Cake",   @ "Angry Birds Cake",   @ "Ham and Cheese Panini",   nil ];
}

在tableView:commitEditingStyle方法,添加下面的代碼來實現從數組中刪除實際數據。你的方法應該是這樣的:


1
2
3
4
5
-   ( void )tableView : (UITableView   * )tableView commitEditingStyle : (UITableViewCellEditingStyle )editingStyle forRowAtIndexPath : ( NSIndexPath   * )indexPath
{
     // Remove the row from data model
     [tableData removeObjectAtIndex :indexPath.row ];
}

NSMutableArray提供了大量的方法來操作的數組內容。在這里,我們利用“removeObjectAtIndex”的方法從數組中刪除一個特定的項目。您可以嘗試運行的應用程序和刪除行。哎呀!應用程序不按預期工作。

這不是一個錯誤。該應用程序從數組中刪除該項目。但為什么刪除的項目仍然出現呢?原因在於沒有刷新界面,以反映更新的數據模型。

3.刷新表視圖

因此,一旦相關的數據將被刪除,我們需要調用reloadData方法要求表視圖刷新。下面是更新后的代碼:

1
2
3
4
5
6
7
8
-   ( 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 ];
}

測試你的應用程序實現刪除操作

嘗試再次運行您的應用程序和刷卡刪除行。您應該能夠將其刪除。

簡單表格應用程序 - 刪除行

簡單表格應用程序中刪除表中的行

與往常一樣,離開我的教程,評論,分享您的經驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM