標籤:des style blog http io ar os 使用 for
(1)效果
(2)原始碼與第三方類庫下載
http://download.csdn.net/detail/wsb200514/8155979
(3)總結
——導航控制器,可以直接用代碼的push和pop來控制控制器之間的跳轉。也可以使用storyboard的segue來:這裡又涉及2種,一種是直接用按鈕拖拽到另一個控制器形成segue,這種segue不可攔截,如果點擊直接跳轉。另一種是從一個控制器拖拽到另一個控制器形成的segue,這種segue沒有明確的點擊誰來跳轉,所以有一個performSegueWithIdentifier方法,一執行這個方法就跳轉,所以一般用在需要判斷的跳轉上面,比如“登入”的按鈕,添加addTarget之後,在按鈕的點擊方法中執行perform跳轉。
——最重要的是資料的傳遞,正向傳遞的方法,主要是利用segue的屬性destinationViewController獲得後面一個控制器,然後給後面這個控制器賦值,可以賦值某一個地方,也可以通過一個資料模型對象把整個資料模型賦值給後面的控制器,前提是這前後兩個控制器都要有這個資料模型屬性。而且這個賦值操作,一般是在prepareForSegue中進行,因為這是在segue跳轉之前調用的一個方法。
——還有反向傳遞,即點擊“返回”時,值需要從當前頁面傳遞到“返回”後的那個頁面。這裡需要用到代理,即在當前版面設定一個協議,然後設定一個代理屬性以及代理方法(主要用來傳遞資料),這個代理方法的參數可以是某一個值也可以是一個資料模型對象。然後在“返回”後的那個頁面上,遵守協議並且實現代理方法,接受到資料,再把資料處理一下。
——我們這裡有用到tableView,所以,涉及到添加和刪除cell。我們還涉及到資料永久花儲存,本案例中我們利用NSKeyedArchive方法把資料存放區為data格式。所以我們每次刪除和添加資料後,不僅需要“重新整理”tableView,還要把資料歸檔一遍。
——我們懶載入數組的時候,也要多一個判斷:如果數組是空,我們就從資料檔案中讀取資料用NSKeyedUnarchive,然後再判斷一下,如果讀取了資料發現還是空就初始化建立這個資料。這裡面的NSKeyedUnchive和上面的NSKeyedArchive都需要資料模型對象遵守NSCoding協議並實現init和encode方法,就是歸檔和解歸檔資料的方式,這裡如果有子類的話,只需要繼承父類,然後實現子類自己的即可。
——第三方類庫的使用,可以直接把.m和.h檔案拖拽到工程裡面即可,當然還有其他安裝方法。我們這裡用到的是MBProgressHUD,下載和使用方法見:https://github.com/jdg/MBProgressHUD
——這裡面監聽鍵盤的值改變,我們用的是通知,記住:用到通知的時候,必須在dealloc函數裡面移除通知,養成好習慣:
- (void)viewDidLoad { [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeText) name:UITextFieldTextDidChangeNotification object:self.userField]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeText) name:UITextFieldTextDidChangeNotification object:self.pwdField]; [super viewDidLoad]; // Do any additional setup after loading the view.}-(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self];}
——在storyboard裡面的導覽列的右邊不能添加2個item,所以只能用代碼實現,即先把右邊那個取出來,然後建立一個,最後把這2個裝成數組賦值給items。
//在storyboard裡面無法添加兩個右邊按鈕,只能代碼 UIBarButtonItem *addItem=self.navigationItem.rightBarButtonItem; UIBarButtonItem *deleteItem=[[UIBarButtonItem alloc]initWithTitle:@"操作" style:UIBarButtonItemStylePlain target:self action:@selector(deleteClick)]; [email protected][addItem,deleteItem];
——tableView有一個編輯操作,即,一進入編輯操作,就類似於“簡訊刪除介面”的效果,在所有cell左邊都出現一個“減號”刪除按鈕一樣。預設是刪除,但可以修改成添加樣式。以下代碼就是實現tableView點擊一下可編輯再點擊不可編輯的效果。
-(void)deleteClick{ self.tableView.editing=!self.tableView.isEditing;}
——如下方法就是設定每一個cell左邊出來的是”減號“的刪除,還是”加號“的添加。我們這一行是添加一行是刪除。
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ return indexPath.row%2 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;}
——點擊登出按鈕後出現的是UIActionSheet,而沒有用UIAlert,並且為了監聽點擊的時sheet上得哪個按鈕,這個控制器還遵守了協議UIActionSheetDelegate,並實現了判斷:如果是點擊”確定“,那麼就退出,返回登入介面,也就是需要在導航控制器上實現pop操作。
- (IBAction)logoutClick:(id)sender { UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:@"確定要登出嘛?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"確定" otherButtonTitles:nil, nil]; [sheet showInView:self.view];}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex==0) { [self.navigationController popViewControllerAnimated:YES]; }}
——在tableView的那個控制器上,因為有2種跳轉,所以需要isKindOfClass判斷一下是跳轉到哪個頁面。這裡面else if裡面就是實現了一個資料的正向傳遞,直接賦值即可。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ id vc=segue.destinationViewController; if ([vc isKindOfClass:[WPAddViewController class]]) { WPAddViewController *addVc=vc; addVc.delegate=self; }else if ([vc isKindOfClass:[WPEditViewController class]]){ WPEditViewController *editVc=segue.destinationViewController; NSIndexPath *path=[self.tableView indexPathForSelectedRow]; editVc.contact=self.contacts[path.row]; editVc.delegate=self; }}
——每當cell左邊出現”減號“或”加號“的時候,我們一點擊,就會調用下面這個方法。所以在這裡我們可以判斷到底點擊的是什麼按鈕,然後執行操作,如果是減號刪除,我們就刪除資料、更新表格、歸檔,如果是添加資料,我們也是添加資料、更新表格、歸檔。只不過,我們這裡的更新表格,並不是用reload更新表格所有的cell,而是用tableView的delete和insert方法實現部分更新。
//刪除資料或添加資料-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle==UITableViewCellEditingStyleDelete) { //1、先更新模型 [self.contacts removeObjectAtIndex:indexPath.row]; //2、再重新整理表格(建議使用第一種只重新整理刪除行以下的那些cell,第二種重新整理全部的表格,耗效能) [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop]; //[self.tableView reloadData]; [NSKeyedArchiver archiveRootObject:self.contacts toFile:filePath]; }else if (editingStyle==UITableViewCellEditingStyleInsert){ WPContact *p2=[[WPContact alloc]init]; [email protected]"jack"; [email protected]"10086"; [self.contacts insertObject:p2 atIndex:indexPath.row+1]; NSIndexPath *indexPathP2=[NSIndexPath indexPathForRow:indexPath.row+1 inSection:0]; [self.tableView insertRowsAtIndexPaths:@[indexPathP2] withRowAnimation:UITableViewRowAnimationBottom]; [NSKeyedArchiver archiveRootObject:self.contacts toFile:filePath]; }}
——因為要實現資料歸檔,所以在每一次更改資料(即這裡存放資料的數組)後,都需要重新歸檔一次。
【iOS開發-76】Private Contacts案例:導航控制器使用、資料傳遞、第三方類庫使用、tableViewCell的添加刪除、資料存放區等