麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

[iOS基礎控件-6.11.3]私人通訊錄Demo控制器的數據傳遞、存儲

2019-11-14 19:42:27
字體:
來源:轉載
供稿:網友
A.需求
1.搭建一個“私人通訊錄”Demo
2.模擬登陸界面
  • 賬號
  • 密碼
  • 記住密碼開關
  • 自動登陸開關
  • 登陸按鈕
3.退出注銷
4.增刪改查
5.恢復數據(取消修改)
 
這個代碼托管了在github: https://github.com/hellovoidworld/ContactBook
(本來網速不好,打算用國內的csdn甚至京東,發現github有現成的app,不用使用命令行,速度還可以,就用github了,界面也是最漂亮的)
 
Image
 
B.基本架構
1. 5個控制器
(1)導航控制器 NavigationController
(2)登陸 UIViewController
  • 輸入賬號密碼
  • 記住密碼、自動登錄開關
  • 登陸跳轉按鈕
(3)聯系人列表 TableViewController
  • 注銷功能
  • 添加聯系人跳轉按鈕
(4)添加聯系人 UIView
(5)查看、編輯 UIView
 
Image
 
C.實現步驟
1.搭建
(1)使用NavigationController作為主控制器
(2)使用storyboard構建UI
(3)每個控制器搭配一個相應的類,用以處理各種事件
 
2.登陸界面
(1)賬號、密碼的輸入框
a.使用TextField
Image(232)
 
 
b.監聽輸入事件
<1> 不能使用addTarget方法,因為addTarget只能監聽點擊事件,不能監聽編輯事件
<2> 不能使用代理進行事件監聽,代理就是控制器,但是只能監聽到開始、結束編輯、允許編輯文字等狀態
<3> 使用通知,就能監聽到正在編輯的狀態了,監聽文字的改變
由通知中心轉發賬號、密碼輸入框的文字編輯狀態信息到控制器,調用指定方法
 1 /* 登陸按鈕監聽賬號、密碼輸入框的通知 2 * 只有當兩者都有內容的時候才能激活登陸按鈕 3 */ 4 - (void) loginButtonListening{ 5     // 監聽賬號輸入 6     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.accountText]; 7     8     // 監聽密碼輸入 9     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.pwdText];10 }11 12 // 記得要在自身被銷毀的時候取消消息訂閱13 - (void)dealloc {14     [[NSNotificationCenter defaultCenter] removeObserver:self];15 }16 17 // 登陸按鈕監聽的觸發事件18 - (void) textChange {19     // 只有當賬號、密碼不為空的時候,才能使用登陸按鈕20     self.loginButton.enabled = self.accountText.text.length && self.pwdText.text.length;21 }
 
(2)登陸
當有賬號、密碼的時候才能激活登陸按鈕
a.驗證賬號、密碼
使用“登陸界面”控制器拖線到“聯系人列表”界面控制器:使用Manual Segue
/** 點擊登陸 */- (IBAction)login {    // 檢測賬號    if (![self.accountText.text isEqualToString:@"hw"]) {        NSLog(@"賬號不存在");        return;    }       // 檢測密碼    if (![self.pwdText.text isEqualToString:@"123"]) {        NSLog(@"密碼不正確");        return;    }       // 根據Segue ID 執行跳轉    [self performSegueWithIdentifier:@"contactList" sender:nil];}
 
Image(233)
 
b.使用第三方包實現登陸效果
Image(234)
 
c.在登陸時,使用一個遮蓋禁止用戶操作
 1 /** 點擊登陸 */ 2 - (IBAction)login { 3     // 檢測賬號 4     if (![self.accountText.text isEqualToString:@"hw"]) { 5         [MBPRogressHUD showError:@"賬號不存在"]; 6         return; 7     } 8     9     // 檢測密碼10     if (![self.pwdText.text isEqualToString:@"123"]) {11         [MBProgressHUD showError:@"密碼錯誤"];12         return;13     }14    15     // 登陸中,遮蓋屏幕,禁止用戶進行其他操作16     [MBProgressHUD showMessage:@"正在使勁登錄中..."];17    18     // 模擬登陸過程,延遲跳轉19     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{20         // 移除遮蓋21         [MBProgressHUD hideHUD];22        23         // 根據Segue ID 執行跳轉24         [self performSegueWithIdentifier:@"contactList" sender:nil];25     });26 }
 
 
Image(235)
 
d. 使用performSegueWithIndentifier:方法執行指定Segue
1         // 根據Segue ID 執行跳轉2         [self performSegueWithIdentifier:@"contactList" sender:nil];
 
(3)記住密碼 & 自動登陸
a.聯動
<1> 取消記住密碼,自動取消自動登陸
<2> 勾選了自動登陸,自動勾選記住密碼
(使用storyboard拖線也可以完成)
 1 /** 點擊記住密碼 */ 2 - (IBAction)keepPwdSwitch { 3     if (!self.keepPwd.isOn) { 4         [self.autoLogin setOn:NO]; 5     } 6 } 7  8 /** 點擊自動登陸 */ 9 - (IBAction)autoLoginSwitch {10     if (self.autoLogin.isOn) {11         [self.keepPwd setOn:YES];12     }13 }
 
(4)在跳轉生效之前,傳輸數據,設置“聯系人列表”標題
使用來源控制器的“prepareForSegue: sender:”方法(需要自行實現)
拿到目標控制器,設置數據
 
 
 
3.聯系人列表
(1)注銷
a.注銷按鈕及其功能
Image(236)
 
b.提醒警告
使用UIActionSheet控件(這是一個從下往上彈出的底部彈窗控件)
控制器遵守 UIActionSheetDelegate 協議
 1 /** 點擊注銷 */ 2 - (IBAction)logout:(UIBarButtonItem *)sender { 3     UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"確定要注銷?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"確定" otherButtonTitles:nil, nil]; 4     5     [sheet showInView:self.view]; 6 } 7  8 #pragma mark - ActionSheet delegate function 9 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {10     if (buttonIndex != 0) return;11    12     // 彈出一個棧頂控制器,即本控制器,回到上一頁13     [self.navigationController popViewControllerAnimated:YES];14 }
 
(2)添加聯系人跳轉
a.在右上角添加 “+” 按鈕
3B2B7A98-AA39-453F-9DFE-C17A58BB5226
 
b.添加一個“添加聯系人”控制器和界面
(下文)
 
4.添加聯系人
(1)基礎搭建
a.在“聯系人列表”界面點擊右上角加號跳轉,使用自動Segue就可以了
Image(237)
 
b.添加姓名、電話輸入框
c."添加"按鈕
 
Image(238)
 
 
d.設置監聽事件(姓名、電話和“添加”按鈕的監聽、事件處理,類似賬號、密碼和“登陸”按鈕)
 1 - (void)viewDidLoad { 2     [super viewDidLoad]; 3     // Do any additional setup after loading the view. 4     5     // 設置“添加”按鈕的激活狀態 6     self.addButton.enabled = NO; 7     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameText]; 8     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.phoneText]; 9 }10  11 - (void)dealloc {12     // 取消訂閱消息監聽13     [[NSNotificationCenter defaultCenter] removeObserver:self];14 }15 16 /** 姓名、電話文本編輯消息處理 17 * 只有當姓名、電話不為空的時候才能使用“添加”按鈕18 */19 - (void) textChange {20     self.addButton.enabled = self.nameText.text.length && self.phoneText.text.length;21 }
 
e.進入即自動彈出鍵盤
1 // 等界面完全顯示完畢,再彈出鍵盤2 - (void)viewDidAppear:(BOOL)animated {3     [super viewDidAppear:animated];4    5     // 將焦點放在“姓名”輸入框6     [self.nameText becomeFirstResponder];7 }
 
(2)數據返傳
點擊“添加”按鈕,把數據傳回給“聯系人列表”
a.關閉當前控制器(“添加聯系人”界面)
b.傳遞數據(使用代理)
設置源控制器(“聯系人列表”控制器)為目標控制器(“添加聯系人”控制器)的代理
點擊“添加”按鈕的時候,使用代理更改“聯系人列表”的數據
 
AddViewController:
 1 /** 點擊添加按鈕 */ 2 - (IBAction)add { 3     // 1.關閉當前控制器 4     [self.navigationController popViewControllerAnimated:YES]; 5     6     // 2.使用模型傳遞數據給上一個控制器(ContactListViewController),使用代理通知數據更新 7     Contact *contact = [[Contact alloc] init]; 8     contact.name = self.nameText.text; 9     contact.phone = self.phoneText.text;10     [self.delegate addViewController:self didAddedContact:contact];11 }
 
c.“聯系人列表”添加數據
ContactListTableViewController:
1 #pragma mark - AddViewController delegate function2 /** 添加聯系人后,更新聯系人列表數據 */3 - (void)addViewController:(AddViewController *)addViewController didAddedContact:(Contact *)contact {4     NSMutableArray *mcontacts = [NSMutableArray arrayWithArray:self.contacts];5     [mcontacts addObject:contact];6     self.contacts = mcontacts;7     [self.tableView reloadData];8 }
 
5.查看/編輯聯系人
(1)拖入一個UIViewController作為“查看/編輯聯系人”控制器
a.姓名、電話的TextField
b.“保存”按鈕
c."編輯/取消" 按鈕
Image(239)
 
(2)跳轉Segue設置
a.在“聯系人列表”控制器中,指定storyboard的cell指定一個ID
2ADA46FC-1ABC-46FF-ADE2-F64925598882
 
b.給上述的cell設置一個自動Segue,指向“查看/編輯聯系人”控制器
Image(240)
 
c.利用storyboard中已經綁定了ID的cell創建cell
ContactCell:
1 + (instancetype) cellWithTableView:(UITableView *) tableView {2     // cell ID 要在storyboard中設置好3     static NSString *ID = @"contactCell";4     // 先從緩存池尋找,如果找不到就從storyboard中創建一個5     return [tableView dequeueReusableCellWithIdentifier:ID];6 }
 
d.在“聯系人列表”控制器的prepareForSegue方法中,根據目標控制器的類型,區分跳轉向“添加聯系人”控制器和“編輯聯系人”控制器
ContactListTableViewController:
 1 #pragma mark - Segue相關 2 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 3     // 取得目標控制器 4     id controller = segue.destinationViewController; 5     6     // 判斷跳轉目標 7     if ([controller isKindOfClass:[AddViewController class]]) { 8         // 如果是“添加聯系人” 9         AddViewController *addViewController = controller;10         addViewController.delegate = self;11     }12    13     if ([controller isKindOfClass:[EditViewController class]]) {14         // 如果是“查看/編輯聯系人”15         EditViewController *editViewController = controller;16        17         // 取出數據18         NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];19         editViewController.contact = self.contacts[indexPath.row];20        21         // 設置代理22         editViewController.delegate = self;23     }24   25 }
 
(3)傳輸數據
不能在prepareForSegue中設置目標控制器的控件數據,因為目標控制器的view還沒有加載
在目標控制器的viewDidLoad方法中做
EditViewController:
 1 - (void)viewDidLoad { 2     [super viewDidLoad]; 3     // Do any additional setup after loading the view. 4     5     // 加載數據 6     self.nameText.text = self.contact.name; 7     self.phoneText.text = self.contact.phone; 8     9     // 設置輸入監聽10     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameText];11     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.phoneText];12 }
 
(4)編輯(右上角加上一個“編輯”按鈕)
a.激活輸入框的編輯狀態
b.激活“保存”按鈕
c.彈出鍵盤
d.姓名和電話輸入框同時為空的時候,保護“保存”按鈕
 
Image(241)
 
(5)取消編輯(進入“編輯”狀態后,將“編輯”按鈕轉換成“取消”按鈕)
a.改變“取消”按鈕為“編輯”按鈕
b.改變輸入框為不可編輯
c.收回鍵盤
e.恢復數據
Image(242)
 
 1 /** 點擊“編輯”或"取消” */ 2 - (IBAction)editOrCancel:(UIBarButtonItem *)sender { 3     // 轉變后的狀態 4     BOOL isChangedToEditMode = [sender.title isEqualToString:@"編輯"]? YES:NO; 5     6     if (isChangedToEditMode) { 7         // 點擊"編輯" 8         // 1.轉變title 9         sender.title = @"取消";10        11         // 2.轉變編輯狀態12         self.nameText.enabled = YES;13         self.phoneText.enabled = YES;14         self.saveButton.hidden = NO;15        16         // 獲得輸入焦點17         [self.nameText becomeFirstResponder];18     } else {19         // 點擊“取消”20         // 1.轉變title21         sender.title = @"編輯";22        23         // 2.轉變編輯狀態24         self.nameText.enabled = NO;25         self.phoneText.enabled = NO;26         self.saveButton.hidden = YES;27        28         // 3.還原數據29         self.nameText.text = self.contact.name;30         self.phoneText.text = self.contact.phone;31        32         // 4.退出鍵盤33         [self.view endEditing:YES];34     }35    36 }37 38 /** 消息監聽事件 */39 - (void) textChange {40     self.saveButton.enabled = self.nameText.text.length && self.phoneText.text.length;41 }
 
(6)保存,返回數據到“聯系人列表”
使用代理,和“添加聯系人”同理
a.關閉頁面
b.傳輸數據
<1> 更新模型數據
<2> 使用代理方法修改模型數據
c.在“聯系人列表”中刷新數據
1 #pragma mark - EditViewController delegate function2 /** “編輯聯系人”的“保存”代理方法, 刷新數據 */3 - (void)editViewController:(EditViewController *)editViewController didSavedContact:(Contact *)contact {4     [self.tableView reloadData];5 }
 
6.自定義分割線
有數據的cell才顯示分割線
(1)系統自帶的分割線實際是一個高度只有1的UIVIew
(2)設置cell的樣式為不帶分割線,自行在返回的cell加上分割線
a.自定義一個集成UITableViewCell的類
Image(243)
 
b.在storyboard設置cell的class為自定義的cell類
Image(244)
 
c.重寫cell的構造方法
1 + (instancetype) cellWithTableView:(UITableView *) tableView {2     // cell ID 要在storyboard中設置好3     static NSString *ID = @"contactCell";4     // 先從緩存池尋找,如果找不到就從storyboard中創建一個5     return [tableView dequeueReusableCellWithIdentifier:ID];6 }
 
注意:
<1> 從storyboard中創建的cell不會調用initWithStyle: reuseIndentifier:方法,但是也會調用awakeFromNib方法
==>
(1)就算重寫initWithStyle: reuseIndentifier:,也不會被調用
(2)把創建分割線的邏輯放在awakeFromNib方法中
 
1 /**2 * 如果cell是通過storyboard或者xib創建,不會調用此方法3 * 如果使用代碼創建cell,才會調用這個方法來初始化cell4 */5 - (instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {6     NSLog(@"initWithStyle");7     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];8     return self;9 }
 
<2> 由于在awakeFromNib中cell的frame還沒被初始化(例如高度永遠是44),所以重寫layoutSubviews來設置分割線的frame
 1 /** 2 * 如果cell是通過storyboard或者xib創建,創建完畢會調用這個方法 3 * 可以在這里初始化cell 4 */ 5 - (void) awakeFromNib { 6     // 自定義一個分割線 7     UIView *divideLine = [[UIView alloc] init]; 8     [divideLine setBackgroundColor:[UIColor blackColor]]; 9     [divideLine setAlpha:0.2];10     [self.contentView addSubview:divideLine];11     self.divideLine = divideLine;12 }13 14 /**15 * 在此方法中,cell的frame確定被初始化完成,可以再這里初始化其子控件的frame16 */17 - (void)layoutSubviews {18     // 切記調用父類方法!19     [super layoutSubviews];20    21     CGFloat lineHeight = 1;22     CGFloat lineWidth = self.frame.size.width;23     CGFloat lineX = 0;24     CGFloat lineY = self.frame.size.height - 1;25    26     self.divideLine.frame = CGRectMake(lineX, lineY, lineWidth, lineHeight);27 }
 
7.持久化數據
有5種方式
  • xml屬性列表(plist)歸檔
  • Preference(偏好設置)
  • NSKeyedArchiver歸檔
  • SQLite3數據庫(關系型數據庫)
  • Core Data
 
(1)“添加聯系人”、“編輯聯系人” 保存之后
a.使用plist保存聯系人數據(賬號、密碼也可以用plist模擬實現)
 1 #pragma mark - AddViewController delegate function 2 /** 添加聯系人后,更新聯系人列表數據 */ 3 - (void)addViewController:(AddViewController *)addViewController didAddedContact:(Contact *)contact { 4     NSMutableArray *mcontacts = [NSMutableArray arrayWithArray:self.contacts]; 5     [mcontacts addObject:contact]; 6     self.contacts = mcontacts; 7     8     // 保存數據到plist文件 9     [self saveContactsDataToFile];10    11     // 刷新界面數據12     [self.tableView reloadData];13 }14 15 #pragma mark - EditViewController delegate function16 /** “編輯聯系人”的“保存”代理方法, 刷新數據 */17 - (void)editViewController:(EditViewController *)editViewController didSavedContact:(Contact *)contact {18     // 保存數據19     [self saveContactsDataToFile];20     // 刷新數據21     [self.tableView reloadData];22 }23 24 #pragma mark - 加載、保存、讀取數據25 /** 保存聯系人數據到plist */26 - (void) saveContactsDataToFile {27     // 沙盒路徑28     NSString *path = NSHomeDirectory();29     // Documents路徑30     NSString *docPath = [path stringByAppendingPathComponent:@"Documents"];31     // plist文件路徑32     NSString *filePath = [docPath stringByAppendingPathComponent:@"contacts.plist"];33    34     NSMutableArray *dictArray = [NSMutableArray array];35     for (Contact *contact in self.contacts) {36         // 將模型轉換成字典進行存儲37         NSDictionary *dict = [Contact dictionaryWithContact:contact];38         [dictArray addObject:dict];39     }40     [dictArray writeToFile:filePath atomically:YES];41     NSLog(@"save to : %@", filePath);42 }
 
b.進入“聯系人”列表的時候讀取數據
 1 /** 加載數據 */ 2 - (NSArray *) contacts { 3     if (nil == _contacts) { 4         // 沙盒路徑 5         NSString *path = NSHomeDirectory(); 6         // Documents路徑 7         NSString *docPath = [path stringByAppendingPathComponent:@"Documents"]; 8         // plist文件路徑 9         NSString *filePath = [docPath stringByAppendingPathComponent:@"contacts.plist"];10        11         // 如果plist文件不存在12         NSFileManager *fileManager = [NSFileManager defaultManager];13         if (![fileManager fileExistsAtPath:filePath]) {14             _contacts = [NSArray array];15             return _contacts;16         }17        18         // 如果plist文件存在,開始讀取19         NSArray *contacts = [NSArray arrayWithContentsOfFile:filePath];20         NSMutableArray *mcontacts = [NSMutableArray array];21         for (NSDictionary *dict in contacts) {22             Contact *contact = [Contact contactWithDictionary:dict];23             [mcontacts addObject:contact];24         }25        26         _contacts = mcontacts;27     }28    29     return _contacts;30 }
 
(2)使用preferences自動記住賬號、密碼
a.進入“登陸”界面,讀取登陸狀態數據
 1 /** 2 * 把初始化代碼放在viewDidAppear 3 * 讓view完全呈現之后才進行自動登陸,否則拿不到view,hideHUD的時候會失效 4 */ 5 - (void)viewDidAppear:(BOOL)animated { 6     // 設置登陸狀態 7     [self readLoginStatus]; 8     9     // 初始化登陸按鈕狀態10     if (!self.accountText.text.length || !self.pwdText.text.length) {11         self.loginButton.enabled = NO;12     }13    14     // 登陸按鈕開始監聽賬號、密碼輸入框15     [self loginButtonListening];16 }17  18 /** 讀取登陸狀態 */19 - (void) readLoginStatus {20     // 記住密碼、自動登錄開關狀態21     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];22     self.keepPwd.on = [defaults boolForKey:@"keepPwd"]? YES:NO; // 防止鍵值對為nil23     self.autoLogin.on = [defaults boolForKey:@"autoLogin"]? YES:NO;24    25     // 賬號、密碼26     if (self.keepPwd.isOn) {27         self.accountText.text = [defaults objectForKey:@"account"];28         self.pwdText.text = [defaults objectForKey:@"pwd"];29     }30    31     // 自動登陸32     if (self.autoLogin.isOn) {33         [self login];34     }35 }
 
b.點擊“登陸”保存登陸狀態
 1 /** 點擊登陸 */ 2 - (IBAction)login { 3     // 檢測賬號 4     if (![self.accountText.text isEqualToString:@"hw"]) { 5         [MBProgressHUD showError:@"賬號不存在"]; 6         return; 7     } 8     9     // 檢測密碼10     if (![self.pwdText.text isEqualToString:@"123"]) {11         [MBProgressHUD showError:@"密碼錯誤"];12         return;13     }14    15     // 登陸中,遮蓋屏幕,禁止用戶進行其他操作16     [MBProgressHUD showMessage:@"正在使勁登錄中..."];17    18     // 模擬登陸過程,延遲跳轉19     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{20         // 移除遮蓋21         [MBProgressHUD hideHUD];22        23         // 根據Segue ID 執行跳轉24         [self performSegueWithIdentifier:@"contactList" sender:nil];25     });26 27     // 保存登陸狀態28     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];29     [defaults setBool:self.keepPwd.isOn forKey:@"keepPwd"];30     [defaults setBool:self.autoLogin.isOn forKey:@"autoLogin"];31    32     // 保存賬號、密碼信息33     if (self.keepPwd.isOn) {34         [defaults setObject:self.accountText.text forKey:@"account"];35         [defaults setObject:self.pwdText.text forKey:@"pwd"];36     }37 }
 
8.“自動登陸”的細節
(1)模擬登陸的遮蓋消除問題
     在登陸控制器中,如果在viewDidLoad中調用登陸方法進行登陸,頁面進入到“聯系人列表”之后,遮蓋的信息并不會隱藏,要在viewDidAppear中調用登陸方法,才能正常運行。
56376EB7-483B-4B96-8503-3FF64C7E0B4C
 
(2)在“聯系人列表”界面,點擊“注銷”回到“登陸”界面,依然會觸發自動登陸
解決:設置一個私有變量保存自動登陸的許可狀態,在非初次進入登陸界面的情況禁止自動登陸
 
 1 /** 自動登陸標識 */ 2 @property(nonatomic, assign) BOOL stopAutoLogin; 3   4 - (void)viewDidDisappear:(BOOL)animated { 5     // 當不是初次出現在屏幕上,禁止自動登陸 6     self.stopAutoLogin = YES; 7 } 8   9 /** 讀取登陸狀態 */10 - (void) readLoginStatus {11     // 記住密碼、自動登錄開關狀態12     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];13     self.keepPwd.on = [defaults boolForKey:@"keepPwd"]? YES:NO; // 防止鍵值對為nil14     self.autoLogin.on = [defaults boolForKey:@"autoLogin"]? YES:NO;15    16     // 賬號、密碼17     if (self.keepPwd.isOn) {18         self.accountText.text = [defaults objectForKey:@"account"];19         self.pwdText.text = [defaults objectForKey:@"pwd"];20     }21    22     // 自動登陸23     if (!self.stopAutoLogin && self.autoLogin.isOn) {24         [self login];25     }26 }
 
9.刪除數據
在“聯系人列表”界面從右往左滑動記錄,會彈出“刪除”按鈕
只需要實現一個tableView協議方法 commitEditingStyle,只需要實現這個方法就會出現“刪除”按鈕
 1 /** 2 * 如果實現了這個方法,就自動實現了滑動刪除功能 3 * 點擊了“刪除”按鈕就會調用 4 * 實質是提交了一個編輯操作導致調用(刪除/添加/編輯) 5 * @param editingStyle 編輯行為 6 * @param indexPath 操作行號 7 */ 8 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 9     // 如果是刪除操作10     if (editingStyle == UITableViewCellEditingStyleDelete) {11         // 1.刪除數據12         NSMutableArray *marray = [NSMutableArray arrayWithArray:self.contacts];13         [marray removeObjectAtIndex:indexPath.row];14         self.contacts = marray;15       16         // 2.刷新界面17 //        [self.tableView reloadData];18         // 只刪掉需要刪除的一行,不必刷新所有數據19         // 使用這個方法,必須刪除對應的模型數據,數量要對應20         [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];21        22         // 3.更改plist數據23         [self saveContactsDataToFile];24     }25 }
 
Image(245)
 
 
10.編輯狀態
在“聯系人列表”界面,點擊一個按鈕,使所有聯系人cell進入編輯狀態
Image(246)
 
a.添加一個“垃圾桶”按鈕
 1 - (void)viewDidLoad { 2     [super viewDidLoad]; 3     4     // 設置無系統自帶分割線 5     [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 6     7     // 取出原來在storyboard中創建的“+”按鈕 8     UIBarButtonItem *addItem = self.navigationItem.rightBarButtonItem; 9    10     // 創建一個“垃圾桶”按鈕11     UIBarButtonItem *deleteItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(deleteCheck)];12    13     // 都放入到右邊的狀態欄14     self.navigationItem.rightBarButtonItems = @[deleteItem, addItem];15 }
 
b.編輯狀態
1 // 點擊狀態欄按鈕“垃圾桶”,使所有cell進入編輯狀態或者退出編輯狀態2 - (void) deleteCheck {3 //    self.tableView.editing = !self.tableView.editing;4     [self.tableView setEditing:!self.tableView.editing animated:YES];5 }
 
c.白邊編輯狀態的功能鍵
 1 // 改變編輯狀態下的編輯按鈕 2 - (UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 3     if (indexPath.row == 0) { 4         // 這里改為“添加”符號,需要自定義事件 5         return UITableViewCellEditingStyleInsert; 6     } else if (indexPath.row == 1) { 7         // none就是什么都沒有,沒有作用 8         return UITableViewCellEditingStyleNone; 9     } else {10         // 默認就是“刪除”11         return UITableViewCellEditingStyleDelete;12     }13 }
 
Image(247)
 
 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲午夜在线视频 | 免费在线观看亚洲 | 激情大乳女做爰办公室韩国 | 久久千人斩 | 中文字幕在线亚洲 | 亚洲成人在线视频网站 | 久久网站热最新地址 | 欧美黑人伦理 | 欧美成年性h版影视中文字幕 | 草草视频在线播放 | 老司机一级毛片 | 亚洲人片在线观看 | 本站只有精品 | 国产精品久久久久久久久久 | 午夜久久视频 | 久色亚洲| 国产亚洲精品久久午夜玫瑰园 | 免费a级黄色片 | 国产91在线高潮白浆在线观看 | 日韩色视频 | 日日鲁一鲁视频 | 欧美一级不卡视频 | 精品一区二区三区在线观看视频 | 亚洲va久久久噜噜噜久久男同 | 午夜视频中文字幕 | 久久精品女人天堂av | 国产精品免费看 | 久久国产精品一区 | 亚洲特黄妇女高潮 | 国产成人精品一区二区三区电影 | 国产成人精品免费视频大全最热 | 久久综合久久综合久久综合 | 在线观看免费精品 | 萌白酱福利视频在线网站 | 久久精品色 | 九九视屏| 国产18视频 | 欧美激情猛片xxxⅹ大3 | 99国内精品视频 | 国产精品久久久久久久久久久久久久久 | 国产成人高潮免费观看精品 |