高級UIKit-04(NSUserDefaults、NSKeyedArchiver、對象歸檔方法)

day05_1_UserDefault】:判斷應用程序是不是第一次運行數組

NSUserDefaults:用來保存應用程序的配置信息如:程序運行次數,用戶登錄信息等。網絡

// 使用系統提供的NSUserDefaults對象判斷

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];app

    int runCount = [[userDefaults objectForKey:@"runCount"intValue];ide

    if (runCount == 0) {編碼

        NSLog(@"第一次運行!!!");atom

    }spa

    runCount++;代理

    [userDefaults setObject:[NSNumber numberWithInt:runCount] forKey:@"runCount"];code

    [userDefaults synchronize]; // 同步orm

 

練習:三個界面ABC,運行次數奇數次進C,偶數次進B

MXAppDelegate.m中寫

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    // 由於那個箭頭能夠直接肯定誰是rootViewController,因此能夠簡化代碼

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    int runCount = [[userDefaults objectForKey:@"runCount"intValue];

    if (runCount % 2 == 0) {

        UIViewController *bVC = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"bVC"];

        [self.window.rootViewController presentViewController:bVC animated:YES completion:nil];

        self.window.rootViewController = bVC;

    }

    runCount++;

    [userDefaults setObject:[NSNumber numberWithInt:runCount] forKey:@"runCount"];

    [userDefaults synchronize]; // 同步

    return YES;

}

 

day05_2_ArrayArchiver】:數組歸檔的使用

歸檔的使用:把對象轉成二進制NSData,能夠進行保存或網絡傳輸

如何實現歸檔:須要讓對象實現NSCoding協議

已經實現了NSCoding協議的對象有:數組和字典

數組歸檔:

// 數組歸檔

    NSArray *namesArray = @[@"張三",@"李四",@"王五"];

    // 1.建立可變的data對象,裝數據

    NSMutableData *data = [NSMutableData data];

    // 2.建立歸檔對象

    NSKeyedArchiver *archiver = [[NSKeyedArchiver allocinitForWritingWithMutableData:data];

    // 3.把對象編碼

    [archiver encodeObject:namesArray forKey:@"names"];

    // 4.編碼完成

    [archiver finishEncoding];

    // 5.保存歸檔

    [data writeToFile:@"/Users/tarena/Desktop/namesArchiver" atomically:YES];

 

數組反歸檔:

// 數組反歸檔

    // 1.獲得data

    NSData *data = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/namesArchiver"];

    // 2.建立反歸檔對象

    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver allocinitForReadingWithData:data];

    // 3.解碼並存到數組中

    NSArray *namesArray = [unArchiver decodeObjectForKey:@"names"];

    // 4.循環打印

    for (NSString *name in namesArray) {

        NSLog(@"%@",name);

    }

 

day05_3_DictionaryArchiver】字典的歸檔反歸檔和數組同樣。

day05_4_AddStringToArchiver】:添加輸入框內容到textView中,關閉程序後textView中內容還在,(UITextView不可編輯,勾掉Editable)

這個使用到歸檔,代碼:

// 加載數組歸檔數據

-(void)loadInfo{

    // 從歸檔中取數據

    // 數組反歸檔

    self.namesTextView.text = @"";

    NSData *nameData = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/nameArrayArchiver"]; // 獲得data

    NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver allocinitForReadingWithData:nameData]; // 建立反歸檔對象

    self.nameArray = [unarc decodeObjectForKey:@"names"]; // 解碼

    for (NSString *name in self.nameArray) { // 取出數組中數據拼接到textView

        self.namesTextView.text = [self.namesTextView.text stringByAppendingFormat:@"%@\n",name];

    }

}

// 添加姓名

- (IBAction)addNameToTextView:(id)sender {

    NSString *name = self.nameTextField.text// 取出輸入的字符串

    NSMutableArray *mutableNameArray = [NSMutableArray arrayWithArray:self.nameArray]; // 把不可變數組變爲可變數組

    [mutableNameArray addObject:name]; // 添加字符串到數組中

   

    // 數組歸檔

    NSMutableData *nameData = [NSMutableData data]; // 建立可變data對象

    NSKeyedArchiver *arc = [[NSKeyedArchiver allocinitForWritingWithMutableData:nameData]; // 建立歸檔對象

    [arc encodeObject:mutableNameArray forKey:@"names"]; // 給數組編碼

    [arc finishEncoding]; // 編碼完成

    [nameData writeToFile:@"/Users/tarena/Desktop/nameArrayArchiver" atomically:YES]; // 保存到指定的路徑

    [self loadInfo];

}

 

總結:反歸檔若是返回數組,通常用NSArray接收,若是在程序中要改變NSArray的值,要先把它轉成可變數組,而後把這個新數組從新歸檔。

注意歸檔時,要建立可變的NSData對象。

day05_5_ArchiverPerson】:對象能夠歸檔反歸檔必須作的事

1.遵照NSCoding協議

2.實現該協議的兩個方法

代碼以下:

// 屬性編碼

- (void)encodeWithCoder:(NSCoder *)aCoder{

   

    [aCoder encodeObject:self.name forKey:@"name"];

   

    [aCoder encodeInteger:self.age forKey:@"age"];

   

}

// 屬性解碼

- (id)initWithCoder:(NSCoder *)aDecoder{

   

    self = [super init];

    if (self) {

        self.name = [aDecoder decodeObjectForKey:@"name"];

        self.age = [aDecoder decodeIntegerForKey:@"age"];

    }

    return self;

  

}

 

day05_6_PersonsArchiver】:人員名單,功能有添加人員,刪除人員,修改人員。使用歸檔。

添加:

添加時要跳轉到新的界面,通常這麼作:

1.若是第一個界面用navigation包含了就把整個界面push到第二個界面,使用viewController鏈接。

2.而後設置該連線也就是segueidentifier值。

3.而後第一個界面中的控件或是tableViewcell經過一個方法[selfperformSegueWithIdentifier:@"personInfoVC"sender:person];進行segue跳轉並能夠傳值。

4.segue跳轉前還有一個方法能夠把傳的值賦給要跳轉的界面,就是- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

在添加界面中首先把歸檔的數據取出來添加進去,而後把新的數據從新歸檔。

添加代碼以下:

// 添加數據

- (IBAction)addOrEditButtonAction:(id)sender {

// 添加

        MXPerson *person = [[MXPerson allocinit];

        person.name = self.nameTextField.text;

        person.age = [self.ageTextField.text intValue];

       

        // 首先須要取出歸檔數據,在往裏添加

        NSData *data = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/persons"];

        NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver allocinitForReadingWithData:data];

        NSArray *oldPersonArray = [unarc decodeObjectForKey:@"persons"];

        NSMutableArray *newPersonArray = [NSMutableArray arrayWithArray:oldPersonArray];

        [newPersonArray addObject:person]; // 添加數據

       

        // 把對象歸檔

        NSMutableData *personData = [NSMutableData data];

        NSKeyedArchiver *arc = [[NSKeyedArchiver allocinitForWritingWithMutableData:personData];

        [arc encodeObject:newPersonArray forKey:@"persons"];

        [arc finishEncoding];

        [personData writeToFile:@"/Users/tarena/Desktop/persons" atomically:YES];

    [self.navigationController popViewControllerAnimated:YES];

}

 

修改:

點擊cell後跳到修改界面,而後點擊按鈕修改。

在跳轉時要把當前cell(也就是數組中的某個元素)的數據傳到修改界面並顯示,修改數據後從新歸檔。

由於在修改界面要用到第一個界面中數組數據,因此在跳轉到修改界面前把本身賦給修改界面的delegate(該代理的類型就是第一個界面),而後進行修改並從新歸檔。

注意:在跳轉時會有多個sender值,在跳轉界面要作判斷。本例中點擊添加,傳的sendernil,點擊cell傳的sender就是該cell數據。

代碼以下:

// 點擊cell後跳轉到修改界面並傳cell的數據

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    MXPerson *person = self.personArray[indexPath.row];

   

    [self performSegueWithIdentifier:@"personInfoVC" sender:person];

   

}

// segue跳轉前把數據賦給修改界面

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

   

    MXViewController *personInfoVC = segue.destinationViewController;

    personInfoVC.person = sender;

    personInfoVC.delegate = self;

   

}

// 添加或修改數據

- (IBAction)addOrEditButtonAction:(id)sender {

    if (self.person) { // 修改

        self.person.name = self.nameTextField.text;

        self.person.age = [self.ageTextField.text intValue];

        [self.delegate savePerson];

    } else// 添加

      }

[self.navigationController popViewControllerAnimated:YES];

}

 

刪除:

從歸檔中刪除,而後保存歸檔

代碼以下:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [self.personArray removeObjectAtIndex:indexPath.row]; // 從歸檔中刪除

        [self savePerson]; // 保存歸檔

        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    }  

    else if (editingStyle == UITableViewCellEditingStyleInsert) {

        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

    }  

}

相關文章
相關標籤/搜索