本教程以第二個教程(“教程:串聯(lián)圖”)中創(chuàng)建的項目為基礎。您將用到從使用設計模式、使用 Foundation 以及編寫自定類中學到的知識,在 ToDoList 應用程序中添加對動態(tài)數(shù)據(jù)的支持。
本教程講述了以下操作:
完成本教程中的所有步驟后,您的應用程序外觀大致是這樣的:
現(xiàn)在就開始吧,請在 Xcode 中打開您的現(xiàn)有項目。
目前,使用串聯(lián)圖的 ToDoList 應用程序有一個界面和一個導航方案?,F(xiàn)在,是時候使用模型對象來添加數(shù)據(jù)儲存和行為了。
應用程序的目標在于創(chuàng)建一個待辦事項列表,因此首先您將創(chuàng)建一個自定類 XYZToDoItem 來表示單個待辦事項。您應該記得,XYZToDoItem 類已經(jīng)在編寫自定類中討論過。
XYZToDoItem 類很容易實現(xiàn)。它具有項目名稱、創(chuàng)建日期,以及該項目是否已完成等屬性。繼續(xù)將這些屬性添加到 XYZToDoItem 類接口。
在項目導航器中,選擇 XYZToDoItem.h。 將以下屬性添加到該接口,使聲明如下所示:
@interface XYZToDoItem : NSObject
@property NSString *itemName;
@property BOOL completed;
@property (readonly) NSDate *creationDate;
@end
檢查點:通過選取“Product”>“Build”(或按下 Command-B)來生成項目。盡管該新類尚未實現(xiàn)任何功能,但是生成它有助于編譯器驗證任何拼寫錯誤。如果發(fā)現(xiàn)錯誤,請及時修正:通讀編輯器提供的警告或錯誤,然后回顧本教程中的說明,確保所有內(nèi)容與此處的描述相符。
您現(xiàn)在有一個類,可以用它作為基礎來為單個列表項目創(chuàng)建并儲存數(shù)據(jù)。您還需要保留一個項目列表。在 XYZToDoListViewController 類中跟蹤此內(nèi)容較為合適,視圖控制器負責協(xié)調(diào)模型和視圖,所以需要對模型進行引用。
Foundation 框架有一個 NSMutableArray 類,很適合跟蹤項目列表。此處必須使用可變數(shù)組,這樣用戶就可以將項目添加到數(shù)組。因為不可變數(shù)組 NSArray 在其初始化后將不允許添加項目。
要使用數(shù)組,您需要聲明并創(chuàng)建它??梢酝ㄟ^分配并初始化數(shù)組來完成。
1.在項目導航器中,選擇 XYZToDoListViewController.m。
由于項目數(shù)組是表格視圖控制器的實現(xiàn)細節(jié),所以應該在 .m 文件中進行聲明,而不是 .h 文件。此操作可讓項目數(shù)組成為您自定類的私有數(shù)組。
2.將以下屬性添加到接口類別中,它是由 Xcode 在您的自定表格視圖控制器類中創(chuàng)建的。聲明應該是這樣的:
@interface XYZToDoListViewController ()
@property NSMutableArray *toDoItems;
@end
3.在 viewDidLoad 方法中分配并初始化 toDoItems 數(shù)組:
- (void)viewDidLoad
{
[super viewDidLoad];
self.toDoItems = [[NSMutableArray alloc] init];
}
viewDidLoad 的實際代碼中有一些附加行被注釋掉了,那些行是 Xcode 創(chuàng)建 XYZListViewController 時插入的。保留與否都沒有影響。
現(xiàn)在,您已經(jīng)擁有了一個可以添加項目的數(shù)組。添加項目將在單獨的方法 loadInitialData 中進行,并將通過 viewDidLoad 調(diào)用該方法。由于此代碼是一個模塊化任務,所以會進入其自身的方法中。當然您也可以將方法分離出來,從而提高代碼的可讀性。在真正的應用程序中,此方法可能會從某種永久儲存形式載入數(shù)據(jù),例如文件?,F(xiàn)在,我們的目標是了解表格視圖如何處理自定數(shù)據(jù)項目,那么讓我們創(chuàng)建一些測試數(shù)據(jù)來體驗一下吧。
以創(chuàng)建數(shù)組的方式創(chuàng)建項目:分配并初始化。然后,給項目命名。該名稱將顯示在表格視圖中。按照此方法創(chuàng)建一組項目。
在 @implementation 行下方,添加一個新方法 loadInitialData。
- (void)loadInitialData {
}
在此方法中,創(chuàng)建幾個列表項目,并將它們添加到數(shù)組。
- (void)loadInitialData {
XYZToDoItem *item1 = [[XYZToDoItem alloc] init];
item1.itemName = @"Buy milk";
[self.toDoItems addObject:item1];
XYZToDoItem *item2 = [[XYZToDoItem alloc] init];
item2.itemName = @"Buy eggs";
[self.toDoItems addObject:item2];
XYZToDoItem *item3 = [[XYZToDoItem alloc] init];
item3.itemName = @"Read a book";
[self.toDoItems addObject:item3];
}
在 viewDidLoad 方法中調(diào)用 loadInitialData。
- (void)viewDidLoad
{
[super viewDidLoad];
self.toDoItems = [[NSMutableArray alloc] init];
[self loadInitialData];
}
檢查點:通過選取“Product”>“Build”來生成項目。您應該會在 loadInitialData 方法的代碼行上看到大量錯誤。第一行是出錯的關鍵所在,錯誤提示應該是“Use of undeclared identifier XYZToDoItem”。這說明編譯器在編譯 XYZToDoListViewController 時不知道 XYZToDoItem。編譯器比較特別,您需要明確告知它應當注意什么。
在 XYZToDoListViewController.m 文件的頂部附近找到 #import "XYZToDoListViewController.h" 行。 緊接著在其下方添加以下行:
#import "XYZToDoItem.h"
檢查點:通過選取“Product”>“Build”來生成項目。項目生成時應該沒有錯誤。
目前,表格視圖具有一個可變數(shù)組,預填充了幾個示例待辦事項。現(xiàn)在您需要在表格視圖中顯示數(shù)據(jù)。
通過讓 XYZToDoListViewController 成為表格視圖的數(shù)據(jù)源,可以實現(xiàn)這一點。無論要讓什么成為表格視圖的數(shù)據(jù)源,都需要實施 UITableViewDataSource 協(xié)議。需要實施的方法正是您在第二個教程中注釋掉的那些。創(chuàng)建有效的表格視圖需要三個方法。第一個方法是 numberOfSectionsInTableView:,它告訴表格視圖要顯示幾個部分。對于此應用程序,表格視圖只需要顯示一個部分,所以實現(xiàn)比較簡單。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
// Return the number of sections.
return 0;
}
您想要單個部分,所以需要移除警告行并將返回值由 0 更改為 1。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
下一個方法 tableView:numberOfRowsInSection: 告訴表格視圖要在給定部分中顯示幾行?,F(xiàn)在表格中有一個部分,并且每個待辦事項在表格視圖中都應該有它自己的行。這意味著行數(shù)應該等于 toDoItems 數(shù)組中的 XYZToDoItem 對象數(shù)。
在項目導航器中,選擇 XYZToDoListViewController.m。
您可看到模板實現(xiàn)的部分是這樣的:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
// Return the number of rows in the section.
return 0;
}
您想要返回所擁有的列表項目的數(shù)量。幸運的是,NSArray 有一個很方便的方法,稱為 count,它會返回數(shù)組中的項目數(shù),因此行數(shù)是 [self.toDoItems count]。
更改 tableView:numberOfRowsInSection: 數(shù)據(jù)源方法,使其返回正確的行數(shù)。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [self.toDoItems count];
}
最后一個方法,tableView:cellForRowAtIndexPath: 請求一個單元格來顯示給定行。到現(xiàn)在為止,您只是處理了代碼,但是界面的絕大部分是針對行顯示的單元格。幸運的是,Xcode 可讓您輕松地在 Interface Builder 中設計自定單元格。首個任務是設計您的單元格,并告訴表格視圖不要使用靜態(tài)內(nèi)容,而要使用具有動態(tài)內(nèi)容的原型單元格。
Interface Builder 會采用您配置的靜態(tài)單元格,并將它們?nèi)哭D(zhuǎn)換為原型。原型單元格,顧名思義,是使用您要顯示的文本樣式、顏色、圖像或其他屬性進行配置,并在運行時從數(shù)據(jù)源獲取其數(shù)據(jù)的單元格。數(shù)據(jù)源會為每一行載入一個原型單元格,然后配置該單元格來顯示該行的數(shù)據(jù)。
要載入正確的單元格,數(shù)據(jù)源需要知道單元格的名稱,并且該名稱也必須在串聯(lián)圖中進行配置。
設定原型單元格名稱時,也將配置另一個屬性—單元格選擇樣式,該樣式用于確定用戶輕按單元格時單元格的外觀。將單元格選擇樣式設定為“None”,使用戶輕按單元格時單元格不會高亮顯示。這是當用戶輕按待辦事項列表中的項目,將其標記為已完成或未完成時,您想要單元格呈現(xiàn)的行為。稍后會在本教程中實現(xiàn)該功能。
您也可以更改原型單元格的字體或其他屬性?;九渲煤苋菀淄瓿?,您可以輕松記下。
下一步是實現(xiàn) tableView:cellForRowAtIndexPath: 方法,讓數(shù)據(jù)源為給定行配置單元格。表格視圖在想要顯示給定行時會調(diào)用此數(shù)據(jù)源方法。對于行數(shù)較少的表格視圖,所有行可能會同時出現(xiàn)在屏幕上,所以表格中的每一行都會調(diào)用此方法。但是,行數(shù)很多的表格視圖在給定時間內(nèi)只會顯示全部項目中的一小部分。最有效的方式是讓表格視圖僅請求要顯示行的單元格,而這一點可通過 tableView:cellForRowAtIndexPath: 讓表格視圖實現(xiàn)。
對于表格中的任何給定行,取回 toDoItems 數(shù)組中的相應條目,然后將單元格的文本標簽設定為項目的名稱。
在項目導航器中,選擇 XYZToDoListViewController.m。
找到 tableView:cellForRowAtIndexPath: 數(shù)據(jù)源方法。模板實現(xiàn)是這樣的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
return cell;
}
該模板執(zhí)行多個任務。它會創(chuàng)建一個變量來保存單元格的標識符,向表格視圖請求具有該標識符的單元格,添加一個注釋注明配置該單元格的代碼應該寫在哪里,然后返回該單元格。
要讓此代碼為您的應用程序所用,需要將標識符更改為您在串聯(lián)圖中設定的標識符,然后添加代碼來配置該單元格。
將單元格標識符更改為您在串聯(lián)圖中設定的標識符。為了避免拼寫錯誤,請將串聯(lián)圖中的標識符拷貝并粘貼到實現(xiàn)文件中。該單元格標識符行現(xiàn)在應該是這樣的:
static NSString *CellIdentifier = @"ListPrototypeCell";
在 return 語句前,添加以下代碼行:
XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
cell.textLabel.text = toDoItem.itemName;
您的 tableView:cellForRowAtIndexPath: 方法應如下圖所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ListPrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
cell.textLabel.text = toDoItem.itemName;
return cell;
}
檢查點:運行您的應用程序。您在 loadInitialData 中添加的項目列表應該在表格視圖中顯示為單元格。
如果無法將待辦事項列表中的項目標記為已完成,那么這個待辦事項列表還不夠好?,F(xiàn)在,讓我們來添加這樣的支持。一個簡單的界面應該可以在用戶輕按單元格時切換完成狀態(tài),并在已完成的項目旁邊顯示勾號。幸運的是,表格視圖附帶了一些內(nèi)建行為,您可以利用這些行為來實現(xiàn)這樣的簡單界面。需要注意的是,在用戶輕按單元格時,表格視圖要通知它們的委托。所以我們的任務是寫一段代碼,對用戶輕按表格中的待辦事項這個操作作出響應。
您在串聯(lián)圖中配置 XYZToDoListViewController 時,Xcode 就已經(jīng)讓它成為表格視圖的委托了。您要做的只是實現(xiàn) tableView:didSelectRowAtIndexPath: 委托方法,使其響應用戶輕按,并在適當時候更新您的待辦事項列表。
選定單元格后,表格視圖會調(diào)用 tableView:didSelectRowAtIndexPath: 委托方法,來查看它應如何處理選擇操作。在此方法中,您需要編寫代碼來更新待辦項目的完成狀態(tài)。
將項目標記為已完成或未完成
在項目導航器中,選擇 XYZToDoListViewController.m。
將以下代碼行添加到文件末尾,在 @end 行正上方:
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
請試著鍵入第二行,而不是拷貝和粘貼。您將發(fā)現(xiàn)代碼補全是 Xcode 最節(jié)省時間的功能之一。當 Xcode 顯示出可能的補全建議列表時,請滾動瀏覽列表,找到想要的建議,然后按下 Return 鍵。Xcode 會為您插入整行。
您想要響應輕按,但并不想讓單元格保持選定狀態(tài)。添加以下代碼,讓單元格在選定后立即取消選定:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
在 toDoItems 數(shù)組中搜索相應的 XYZToDoItem。
XYZToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row];
切換被輕按項目的完成狀態(tài)。
tappedItem.completed = !tappedItem.completed;
告訴表格視圖重新載入您剛更新過數(shù)據(jù)的行。
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
您的 tableView:didSelectRowAtIndexPath: 方法應如下圖所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:NO];
XYZToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row];
tappedItem.completed = !tappedItem.completed;
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
檢查點:運行您的應用程序。您在 loadInitialData 中添加的項目列表在表格視圖中顯示為單元格。但當您輕按項目時,并沒有任何反應。為什么呢?
原因是您尚未配置顯示項目完成狀態(tài)的表格視圖單元格。要實現(xiàn)此功能,您需要回到 tableView:cellForRowAtIndexPath: 方法,并配置單元格以在項目完成時顯示指示。
指示項目已完成的一種方式是在其旁邊放置一個勾號。幸運的是,表格視圖右邊可以有一個單元格附屬物。默認情況下,單元格中沒有任何附屬物;不過您可以進行更改,使其顯示不同的附屬物。其中的一個附屬物就是勾號。您要做的是根據(jù)待辦事項的完成狀態(tài),設定單元格的附屬物。
前往 tableView:cellForRowAtIndexPath: 方法。
在設定單元格的文本標簽的代碼行下方添加以下代碼:
if (toDoItem.completed) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
您的 tableView:cellForRowAtIndexPath: 方法現(xiàn)在應如下圖所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ListPrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
cell.textLabel.text = toDoItem.itemName;
if (toDoItem.completed) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
檢查點:運行應用程序。您在 loadInitialData 中添加的項目列表在表格視圖中顯示為單元格。輕按項目時,其旁邊應該出現(xiàn)一個勾號。如果您再次輕按同一項目,勾號會消失。
構(gòu)建待辦事項列表應用程序功能的最后一步是實現(xiàn)添加項目的能力。當用戶在 XYZAddToDoItemViewController 場景的文本欄中輸入項目名稱,并輕按“Done”按鈕時,您想要視圖控制器創(chuàng)建一個新的列表項目并將其傳遞回 XYZToDoListViewController,以顯示在待辦事項列表中。
首先,您需要擁有一個列表項目來進行配置。就像表格視圖那樣,視圖控制器是將界面連接到模型的邏輯位置。為 XYZAddToDoItemViewController 添加一個屬性來保存新的待辦事項。
在項目導航器中,選擇 XYZAddToDoItemViewController.h。
由于稍后需要從表格視圖控制器訪問列表項目,所以務必將其設為公共屬性。這就是為什么要在接口文件 XYZAddToDoItemViewController.h 中聲明它,而不在實現(xiàn)文件 XYZAddToDoItemViewController.m 中聲明的原因所在。
將 import 聲明添加到 @interface 行上方的 XYZToDoItem 類中。
#import "XYZToDoItem.h"
將 toDoItem 屬性添加到該接口。
@interface XYZAddToDoItemViewController : UIViewController
@property XYZToDoItem *toDoItem;
@end
要獲得新項目的名稱,視圖控制器需要訪問用戶輸入名稱的文本欄。要實現(xiàn)此功能,請創(chuàng)建從 XYZAddToDoItemViewController 類到串聯(lián)圖中的文本欄的連接。
在大綱視圖中,選擇 XYZAddToDoItemViewController 對象。
點按窗口工具欄右上角的“Assistant”按鈕,打開輔助編輯器。
右邊的編輯器出現(xiàn)時,應該顯示有 XYZAddToDoItemViewController.m。如果未顯示,請點按右邊的編輯器中的文件名,并選取 XYZAddToDoItemViewController.m。
輔助編輯器可讓您一次打開兩個文件,以便能夠在它們之間執(zhí)行操作。例如,在源文件中鍵入一個屬性,而源文件的對象又在接口文件中。
在串聯(lián)圖中選擇文本欄。
按住 Control 鍵從畫布上的文本欄拖到右邊編輯器中的代碼顯示窗口,到達 XYZAddToDoItemViewController.m 中的 @interface 行正下方時停止拖移。
在出現(xiàn)的對話框中,為“Name”欄鍵入“textField”。 讓選項的其余部分保持不變。您的對話框應如下圖所示:
點按“Connect”。
Xcode 會將必要的代碼添加到 XYZAddToDoItemViewController.m,用于儲存指向文本欄的指針,并配置串聯(lián)圖來設置該連接。
另外,您需要知道何時創(chuàng)建項目。如果想要僅在“Done”按鈕被輕按時才創(chuàng)建項目,那么請將“Done”按鈕添加為 Outlet。
在串聯(lián)圖中,打開輔助編輯器,將最右邊的窗口設定為 XYZAddToDoItemViewController.m。
在串聯(lián)圖中選擇“Done”按鈕。
按住 Control 鍵從畫布上的“Done”按鈕拖到右邊的編輯器中的代碼顯示窗口,到達 XYZAddToDoItemViewController.m 中的 textField 屬性正下方的行時停止拖移。
在出現(xiàn)的對話框中,在“Name”欄鍵入“doneButton”。
保持選項的其余部分不變。對話框應如下圖所示:
點按“Connect”。
您現(xiàn)在有了識別“Done”按鈕的方式。由于想在輕按“Done”按鈕時創(chuàng)建一個項目,所以需要知道該按鈕何時被按下。
當用戶輕按“Done”按鈕時,它會啟動一個 unwind segue,返回到待辦事項列表,這正是您在第二個教程中配置的接口。在 segue 執(zhí)行前,系統(tǒng)通過調(diào)用 prepareForSegue:,給所包含的視圖控制器一次準備機會。這便是檢查用戶是否輕按了“Done”按鈕的時候。如果是,將會創(chuàng)建一個新的待辦事項。您可以檢查輕按了哪一個按鈕,如果是“Done”按鈕,將會創(chuàng)建項目。
在項目導航器中選擇 XYZAddToDoItemViewController.m。
在 @implementation 行下方添加 prepareForSegue: 方法:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
}
在此方法中,請查看“Done”按鈕是否按下。
如果未按下就不存儲項目,而是讓方法返回但不執(zhí)行任何其他操作。
if (sender != self.doneButton) return;
查看一下文本欄中是否有文本。
if (self.textField.text.length > 0) {
}
如果有文本,將會創(chuàng)建一個新項目,并用文本欄中的文本為其命名。另外,請確保完成狀態(tài)被設定為“NOfalse”。
self.toDoItem = [[XYZToDoItem alloc] init];
self.toDoItem.itemName = self.textField.text;
self.toDoItem.completed = NO;
如果沒有文本,您就不需要存儲項目,也不需要執(zhí)行任何其他操作。 您的 prepareForSegue: 方法應如下圖所示:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if (sender != self.doneButton) return;
if (self.textField.text.length > 0) {
self.toDoItem = [[XYZToDoItem alloc] init];
self.toDoItem.itemName = self.textField.text;
self.toDoItem.completed = NO;
}
}
既然創(chuàng)建了一個新項目,那么就需要將該項目傳遞回 XYZToDoListViewController,以便它可以將項目添加到待辦事項列表。要完成此功能,請重新訪問您在第二個教程中編寫的 unwindToList: 方法。當用戶輕按“Cancel”或“Done”按鈕,XYZAddToDoItemViewController 場景會在關閉時調(diào)用該方法。
就像作為 unwind segue 目標的所有方法一樣,unwindToList: 方法也采用 segue 作為參數(shù)。segue 參數(shù)是從 XYZAddToDoItemViewController 展開并返回到 XYZToDoListViewController 的過渡。由于 segue 是兩個視圖控制器之間的過渡,所以知道它的源視圖控制器是 XYZAddToDoItemViewController。通過向 segue 對象請求其源視圖控制器,您可以用 unwindToList: 方法訪問儲存在源視圖控制器中的任何數(shù)據(jù)。目前,您想要訪問 toDoItem。如果它是 nil,則該項目并未創(chuàng)建。原因可能是文本欄沒有文本,或者是用戶輕按了“Cancel”按鈕。如果 toDoItem 有值,則可以取回該項目,再添加到 toDoItems 數(shù)組,并通過重新載入表格視圖中的數(shù)據(jù)將其顯示在待辦事項列表中。
在項目導航器中,選擇 XYZToDoListViewController.m。
將 import 聲明添加到 @interface 行上方的 XYZAddToDoItemViewController 類中。
#import "XYZAddToDoItemViewController.h"
找到您在第二個教程中添加的 unwindToList: 方法。
在此方法中,取回源視圖控制器 XYZAddToDoItemViewController,即您要展開的控制器。
XYZAddToDoItemViewController *source = [segue sourceViewController];
取回控制器的待辦事項。
XYZToDoItem *item = source.toDoItem;
這就是輕按“Done”按鈕時創(chuàng)建的項目。
看看這個項目是否存在。
if (item != nil) {
}
如果是 nil,可能是“Cancel”按鈕關閉了屏幕,或者是文本欄中沒有文本,因此不必存儲該項目。
如果項目存在,請?zhí)砑拥?toDoItems 數(shù)組。
[self.toDoItems addObject:item];
重新載入表格中的數(shù)據(jù)。
因為表格視圖不會跟蹤其數(shù)據(jù),所以數(shù)據(jù)源(在這個程序中是表格視圖控制器)有責任通知表格視圖何時有新數(shù)據(jù)供其顯示。
[self.tableView reloadData];
您的 unwindToList: 方法應如下圖所示:
- (IBAction)unwindToList:(UIStoryboardSegue *)segue
{
XYZAddToDoItemViewController *source = [segue sourceViewController];
XYZToDoItem *item = source.toDoItem;
if (item != nil) {
[self.toDoItems addObject:item];
[self.tableView reloadData];
}
}
檢查點:運行您的應用程序?,F(xiàn)在,當您點按添加按鈕 (+) 并創(chuàng)建一個新項目時,它應該會顯示在待辦事項列表中。恭喜您!您已經(jīng)創(chuàng)建了一個應用程序,它能接收用戶的輸入,將其儲存在對象中,并在兩個視圖控制器之間傳遞該對象。對于基于串聯(lián)圖的應用程序,這是在場景之間移動數(shù)據(jù)的基礎。
您差不多完成了開發(fā) iOS 應用程序的入門之旅。最后一部分更詳細地講述了如何查詢文稿材料,并且為您學習創(chuàng)建更高級的應用程序給出了一些后續(xù)建議。
更多建議: