【iOS開發-76】Private Contacts案例:導航控制器使用、資料傳遞、第三方類庫使用、tableViewCell的添加刪除、資料存放區等

來源:互聯網
上載者:User

標籤: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的添加刪除、資料存放區等

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.