【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 alloc] initForWritingWithMutableData: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 alloc] initForReadingWithData: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 alloc] initForReadingWithData: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 alloc] initForWritingWithMutableData: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.而後設置該連線也就是segue的identifier值。
3.而後第一個界面中的控件或是tableView的cell經過一個方法[selfperformSegueWithIdentifier:@"personInfoVC"sender:person];進行segue跳轉並能夠傳值。
4.在segue跳轉前還有一個方法能夠把傳的值賦給要跳轉的界面,就是- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
在添加界面中首先把歸檔的數據取出來添加進去,而後把新的數據從新歸檔。
添加代碼以下:
// 添加數據
- (IBAction)addOrEditButtonAction:(id)sender {
// 添加
MXPerson *person = [[MXPerson alloc] init];
person.name = self.nameTextField.text;
person.age = [self.ageTextField.text intValue];
// 首先須要取出歸檔數據,在往裏添加
NSData *data = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/persons"];
NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSArray *oldPersonArray = [unarc decodeObjectForKey:@"persons"];
NSMutableArray *newPersonArray = [NSMutableArray arrayWithArray:oldPersonArray];
[newPersonArray addObject:person]; // 添加數據
// 把對象歸檔
NSMutableData *personData = [NSMutableData data];
NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:personData];
[arc encodeObject:newPersonArray forKey:@"persons"];
[arc finishEncoding];
[personData writeToFile:@"/Users/tarena/Desktop/persons" atomically:YES];
[self.navigationController popViewControllerAnimated:YES];
}
修改:
點擊cell後跳到修改界面,而後點擊按鈕修改。
在跳轉時要把當前cell(也就是數組中的某個元素)的數據傳到修改界面並顯示,修改數據後從新歸檔。
由於在修改界面要用到第一個界面中數組數據,因此在跳轉到修改界面前把本身賦給修改界面的delegate(該代理的類型就是第一個界面),而後進行修改並從新歸檔。
注意:在跳轉時會有多個sender值,在跳轉界面要作判斷。本例中點擊添加,傳的sender是nil,點擊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
}
}