您好,登錄后才能下訂單哦!
Mark Items as Completed
給項目添加完成標記
如果你永遠不標記事項完成,那么待辦事宜清單就不夠好。現在,你將添加這項支持。一個簡單的接口將完成狀態的切換當用戶點擊表單元并且讓完成項顯示完成標記。幸運的是,表視圖有一些內建的行為能讓你利用用來實現簡單的接口——顯然,當用戶點擊表單元的時候表視圖會通知它們的委托。因此,任務是編寫代碼,應對用戶在表中點擊待辦事宜項。
當你在故事板中設置表格時,Xcode已經為表視圖設置了XYZToDoListViewController:的委托。你所要做的就是實現tableView:didSelectRowAtIndexPath:委托方法來響應用戶點擊和正確更新你的待辦事宜清單項。
當表單元被選中后,表視圖調用tableView:didSelectRowAtIndexPath:委托方法來看應該如何處理選擇。在這個方法中,你將寫一些代碼來更新待辦事宜項的完成狀態。
為項完成或未完成添加標記
1.在工程導航器中選擇XYZToDoListViewController.m.
2.在 @end 前面添加如下代碼:
#pragma mark - Table view delegate
-(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
}
嘗試輸入第二行,而不是粘貼復制。你將會發現Xcode完成代碼的一個很節省時間特性。當Xcode帶有潛在完成的列表的時候,滾動這個列表直到你找到你想輸入的哪一行然后點擊回車。Xcode會為你輸入整行。
5.你想響應點擊但不是真的離開表單元選擇。添加如下代碼會在選擇后立刻取消選擇。
.[tableViewdeselectRowAtIndexPath:indexPathanimated:NO];
6.
7.
8.在你的toDoItems數組中找到相應的XYZToDoItem。
.XYZToDoItem*tappedItem=[self.toDoItemsobjectAtIndex:indexPath.row];
9.
10.
11.開關被點擊項的完成狀態。
.tappedItem.completed=!tappedItem.completed;
12.
13.
14.告訴表視圖重新加載你剛剛更新的行的數據。
.[tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationNone];
15.
16.
你的tableView:didSelectRowAtIndexPath:方法看上去如下:
.-(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath
.
.{
.
.[tableViewdeselectRowAtIndexPath:indexPathanimated:NO];
.
.XYZToDoItem*tappedItem=[self.toDoItemsobjectAtIndex:indexPath.row];
.
.tappedItem.completed=!tappedItem.completed;
.
.[tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationNone];
.
.}
.
Checkpoint: 運行你的app。在loadInitialData中添加的項清單在你的表視圖的表單元中可見。但是當你點擊項時,沒有發生任何事。為什么?
原因是內沒有完成表視圖單元顯示完成狀態的配置。你需要返回到tableView:cellForRowAtIndexPath方法并配置表單元在項目完成的時候顯示一個指示。
通過一個方法來指示一個項目已經完成是在它后面安放一個復選標記。幸運的是,表視圖單元有一個表單元附件在右側。在默認的情況下,沒有附件,然而你能夠改變表單元來顯示不同的附件,其中一級就是復選標記。所有你需要做的就是基于待辦事宜項目的完成狀態來設置表單元附件。
顯示項目的完成狀態
1.到 tableView:cellForRowAtIndexPath: 方法.
2.在設置表單元文本標簽的后面添加如下方法:
.if(toDoItem.completed){
.
.cell.accessoryType=UITableViewCellAccessoryCheckmark;
.
.}else{
.
.cell.accessoryType=UITableViewCellAccessoryNone;
.
.}
3.
4.
你的 tableView:cellForRowAtIndexPath: 方法如下所示:
.-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
.
.{
.
.staticNSString*CellIdentifier=@"ListPrototypeCell";
.
.UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:indexPath];
.
.XYZToDoItem*toDoItem=[self.toDoItemsobjectAtIndex:indexPath.row];
.
.cell.textLabel.text=toDoItem.itemName;
.
.if(toDoItem.completed){
.
.cell.accessoryType=UITableViewCellAccessoryCheckmark;
.
.}else{
.
.cell.accessoryType=UITableViewCellAccessoryNone;
.
.}
.
.returncell;
.
.}
.
Checkpoint: 運行你的app。表視圖的表單元顯示你在loadInitialData中添加的項目清單。當你點擊項時,一個復選框將在它后面出現。如果你在同一項點擊,那么復選框消失。
Add New Items
添加新項目
創建待辦事宜清單應用程序的最后一個步驟是實現添加事項的能力。當用戶在XYZAddToDoItemViewController場景中的文本字段里輸入一個項目的名字并點擊Done按鈕,你希望視圖控制器能夠創建一個新的表項目并且把它傳遞到XYZToDoListViewController在待辦事宜清單中顯示。
首先,你需要有一個清單項來配置。就像表視圖一樣,視圖控制器是連接界面和模型的邏輯位置。給XYZAddToDoItemViewController一個屬性來保存新添加的待辦事宜項。
添加XYZToDoItem到XYZAddToDoItemViewController類
1.在工程導航器中,選擇XYZAddToDoItemViewController.h.
因為你稍后將需要從表視圖控制器訪問這個清單項,所以讓它成為公有屬性非常重要。通過這種方式,你在接口文件中聲明它。
2.在 @interface 行前面添加XYZToDoItem類的聲明。
.#import "XYZToDoItem.h"
3.
4.
5.添加toDoItem屬性到接口文件。
.@interfaceXYZAddToDoItemViewController : UIViewController
.
.
.
.@propertyXYZToDoItem*toDoItem;
.
.
.
.@end
6.
7.
為了取得新項的名字,視圖控制器需要訪問用戶在文本字段中輸入的名字的內容。為了做到這點,從XYZAddToDoItemViewController類中創建一個連接,連接到你的故事板中的文本字段。
連接文本字段到你的視圖控制器
1.在大綱視圖選擇XYZAddToDoItemViewController 對象.
2.點擊在窗口工具欄右上角的助理按鈕,打開助理編輯器。
這個編輯器的右邊將出現XYZAddToDoItemViewController.m。如果它沒有顯示,點擊右側的編輯器里面的文件名并選擇XYZAddToDoItemViewController.m。
助理編輯器允許你有兩個文件同時顯示,使它可以執行在兩個文件之間的操作——例如,將一個源文件中的對象拖到你的界面。
3.在你的故事板中選擇文本字段。
4.從畫布中拖拽文本字段到右側的代碼顯示的編輯器,在XYZAddToDoItemViewController.m中的@interface行下面釋放拖拽。
5.I再出現的對話框中,Name字段,鍵入textField.
剩下的選項不變。你的對話框看上去如下所示:
6.點擊 Connect.
Xcode添加必要的代碼到XYZAddToDoItemViewController.m來儲存文本字段的點,并配置故事板來建立連接。
另外,你需要知道何時創建項目。你想創建項目只有在Done按鈕被按下的時候。為了做到這點,要添加Done按鈕的出口。
連接Done按鈕到你的視圖控制器
1.在故事板中,打開助理編輯器,并設置右側的窗口為XYZAddToDoItemViewController.m.
2.在故事板中選擇Done按鈕。
3.從畫布中按鈕Control并拖拽Done按鈕到編輯器的右側,在XYZAddToDoItemViewController.m中的textField屬性下面釋放拖拽。
4.在出現的對話框中,Name字段,鍵入doneButton。
剩下的選項不變。你的對話框如下所示。
5.點擊 Connect.
你現在有了一個方法來識別Done按鈕。因為你想當Done按鈕被按下的時候創建一個項,你需要知道什么時候發生。
當用戶按下Done按鈕,它開始一個unwind segue返回到待辦事宜清單——你在第二個教程中創建的界面。在segue執行之前,系統給這個視圖控制器相關的選擇來通過調用prepareForSegue:來準備。正是這一點,你想要檢查是否用戶按下了Done按鈕,如果按下了,創建一個新的待辦事宜項。你能檢查哪一個按鈕被按下,如果是Done按鈕,則常見項目。
在按下Done按鈕后創建一個項
1.在工程導航器中選擇 XYZAddToDoItemViewController.m。
2.在 @implementation 行后面添加 prepareForSegue:方法。
.-(void)prepareForSegue:(UIStoryboardSegue*)seguesender:(id)sender
.
.{
.
.}
3.
4.
5.在方法中,看Done按鈕是否被按下。
如果沒有,你希望方法返回但不做任何事情。
.if(sender!=self.doneButton)return;
6.
7.
8.看文本字段是否有文本。
.if(self.textField.text.length>0){
.
.}
9.
10.
11.如果有文本,創建一個新的項目,把它的名字命名為文本字段中的文本。同時,要確保完成狀態設置為NO。
.self.toDoItem=[[XYZToDoItemalloc]init];
.
.self.toDoItem.itemName=self.textField.text;
.
.self.toDoItem.completed=NO;
12.
13.
如果沒有字段,你不希望它保存項,所以你不做任何事情。
你的 prepareForSegue: 方法如下所示:
.-(void)prepareForSegue:(UIStoryboardSegue*)seguesender:(id)sender
.
.{
.
.if(sender!=self.doneButton)return;
.
.if(self.textField.text.length>0){
.
.self.toDoItem=[[XYZToDoItemalloc]init];
.
.self.toDoItem.itemName=self.textField.text;
.
.self.toDoItem.completed=NO;
.
.}
.
.}
.
你已經創建了一個新項,你需要把它傳遞到XYZToDoListViewController,這樣它能被加到待辦事宜清單中。為了實現這一點,你需要重新審視你在第二個教程中寫的unwindToList:方法。當XYZAddToDoItemViewController場景關閉的時候,這個方法被回調,當用戶按下Cancel或Done按鈕時這種情況發生。
unwindToList方法把segue座位參數,就像所有的方法使用unwind segue作為目標一樣。這個segue參數是從XYZAddToDoItemViewController返回到XYZToDoListViewController的segue。因為一個segue是兩個視圖控制器之間的轉換,它知道他的源視圖控制器——XYZAddToDoItemViewController。通過項它的源視圖控制器請求segue對象,你能在unwindToList:方法中訪問任何在源視圖控制器中存儲的數據。如果是nil,這個項目永遠不會被創建——文本字段沒有文本或者Cancel按鈕被按下。如果有一個值,你檢索這個項目,添加它到你的toDoItems數組,并且通過重新加載表視圖中的數據來顯示在待辦事宜清單中。
儲存和顯示新的項
1.在工程視圖中選擇XYZToDoListViewController.m.
2.在 XYZAddToDoItemViewController 類上面@interface行之前添加一個import聲明。
.#import "XYZAddToDoItemViewController.h"
3.
4.
5.在第二個教程你所添加的方法中找到 unwindToList:方法。
6.在這個方法中,檢索源視圖控制器——你從XYZAddToDoItemViewController返回到的控制器
.XYZAddToDoItemViewController*source=[seguesourceViewController];
7.
8.
9.檢索控制器的待辦事宜項。
.XYZToDoItem*item=source.toDoItem;
10.
11.
當Done按鈕被按下后,這個項被創建。
12.看這個項是否存在。
.if(item!=nil){
.
.}
13.
14.
If it does exist, add the item to your toDoItems array. 如果存在,把項加入toDoItems數組。
.[self.toDoItemsaddObject:item];
15.
16.
17.重新加載你的表的數據。
因為表視圖不能跟蹤數據,數據是數據源來負責的——這個地方,你的視圖控制器——來通知表視圖有新數據。
.[self.tableViewreloadData];
18.
19.
你的 unwindToList: 方法如下所示:
.-(IBAction)unwindToList:(UIStoryboardSegue*)segue
.
.{
.
.XYZAddToDoItemViewController*source=[seguesourceViewController];
.
.XYZToDoItem*item=source.toDoItem;
.
.if(item!=nil){
.
.[self.toDoItemsaddObject:item];
.
.[self.tableViewreloadData];
.
.}
.
.}
.
Checkpoint:運行app。現在你點擊(+)并創建一個新項,你應該可以在你的待辦事宜清單中看見。恭喜你,你已經創建了一個根據用戶輸入、儲存到對象、并在兩個視圖控制器中傳遞對象的app。這是以故事板為基礎在兩個場景中移動數據的app。
Recap
回顧
你幾乎完成了這篇關于開發iOS app的介紹性文章。在最后的部分給你更多關于如何在這個文檔中找到你想要的內容的信息,以及提出了下一步你如何學習關于創建更高級app的建議。
Writing a Custom Class
iOS Technologies
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。