03通讯录
03-小码哥通讯录(登录界面)
// XMGLoginViewController.m // 小码哥通讯录 #import "XMGLoginViewController.h" @interface XMGLoginViewController ()<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UIButton *loginBtn; @property (weak, nonatomic) IBOutlet UITextField *accountField; @property (weak, nonatomic) IBOutlet UITextField *pwdField; @property (weak, nonatomic) IBOutlet UISwitch *rmbPwdSwitch; @property (weak, nonatomic) IBOutlet UISwitch *autoLoginSwitch; @end @implementation XMGLoginViewController // 记住密码开关状态改变的时候调用 - (IBAction)rmbPwdChange:(id)sender { // 如果取消记住密码,自动登录也需要取消勾选 if (_rmbPwdSwitch.on == NO) { // 取消记住密码 // 取消自动登录 [_autoLoginSwitch setOn:NO animated:YES]; } } // 自动登录开关状态改变的时候调用 - (IBAction)autoLoginChange:(id)sender { // 如果勾选了自动登录,记住密码也要勾选 if (_autoLoginSwitch.on == YES) { [_rmbPwdSwitch setOn:YES animated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 监听文本框是否有内容 // _accountField.delegate = self; // 给文本框添加监听器,及时监听文本框内容的改变 [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; } // 任一一个文本框的内容改变都会调用 - (void)textChange { _loginBtn.enabled = _accountField.text.length && _pwdField.text.length; NSLog(@"%@--%@",_accountField.text,_pwdField.text); } // 当用户输入的时候就会调用,判断下用户是否允许输入 // 及时的判断文本框有没有内容 // 注意这个方法不能及时获取文本框的内容 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSLog(@"%@",_accountField.text); return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
04-小码哥通讯录(登录功能)
// // XMGLoginViewController.m // 小码哥通讯录 #import "XMGLoginViewController.h" #import "MBProgressHUD+XMG.h" @interface XMGLoginViewController ()<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UIButton *loginBtn; @property (weak, nonatomic) IBOutlet UITextField *accountField; @property (weak, nonatomic) IBOutlet UITextField *pwdField; @property (weak, nonatomic) IBOutlet UISwitch *rmbPwdSwitch; @property (weak, nonatomic) IBOutlet UISwitch *autoLoginSwitch; @end @implementation XMGLoginViewController // 点击了登录按钮的时候调用 // xmg 123 - (IBAction)login:(id)sender { // 提示用户,正在登录ing... [MBProgressHUD showMessage:@"正在登录ing..."]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 隐藏蒙版 [MBProgressHUD hideHUD]; // 验证下账号和密码是否正确 if ([_accountField.text isEqualToString:@"xmg"] && [_pwdField.text isEqualToString:@"123"]) { // 输入正确 // 直接跳转 // 跳转到联系人界面 [self performSegueWithIdentifier:@"login2Contact" sender:nil]; }else{ // 账号或者密码错误 // 提示用户账号或者密码错误 [MBProgressHUD showError:@"账号或者密码错误"]; } }); } // 记住密码开关状态改变的时候调用 - (IBAction)rmbPwdChange:(id)sender { // 如果取消记住密码,自动登录也需要取消勾选 if (_rmbPwdSwitch.on == NO) { // 取消记住密码 // 取消自动登录 [_autoLoginSwitch setOn:NO animated:YES]; } } // 自动登录开关状态改变的时候调用 - (IBAction)autoLoginChange:(id)sender { // 如果勾选了自动登录,记住密码也要勾选 if (_autoLoginSwitch.on == YES) { [_rmbPwdSwitch setOn:YES animated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 监听文本框是否有内容 // _accountField.delegate = self; // 给文本框添加监听器,及时监听文本框内容的改变 [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; } // 任一一个文本框的内容改变都会调用 - (void)textChange { _loginBtn.enabled = _accountField.text.length && _pwdField.text.length; NSLog(@"%@--%@",_accountField.text,_pwdField.text); } // 当用户输入的时候就会调用,判断下用户是否允许输入 // 及时的判断文本框有没有内容 // 注意这个方法不能及时获取文本框的内容 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSLog(@"%@",_accountField.text); return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
// // XMGContactViewController.m // 小码哥通讯录 #import "XMGContactViewController.h" @interface XMGContactViewController ()<UIActionSheetDelegate> @end @implementation XMGContactViewController // 点击注销的时候调用 - (IBAction)logout:(id)sender { // 弹出actionSheet UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"是否注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"注销" otherButtonTitles:nil, nil]; [sheet showInView:self.view]; } #pragma mark - UIActionSheetDelegate // 点击UIActionSheet控件上的按钮调用 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { // 点击了注销 [self.navigationController popViewControllerAnimated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { #warning Potentially incomplete method implementation. // Return the number of sections. return 0; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { #warning Incomplete method implementation. // Return the number of rows in the section. return 0; } /* - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; // Configure the cell... return cell; } */ /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */ /* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [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 } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
05-小码哥通讯录(顺传)
// // XMGLoginViewController.m // 小码哥通讯录 #import "XMGLoginViewController.h" #import "MBProgressHUD+XMG.h" @interface XMGLoginViewController ()<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UIButton *loginBtn; @property (weak, nonatomic) IBOutlet UITextField *accountField; @property (weak, nonatomic) IBOutlet UITextField *pwdField; @property (weak, nonatomic) IBOutlet UISwitch *rmbPwdSwitch; @property (weak, nonatomic) IBOutlet UISwitch *autoLoginSwitch; @end /* 来源控制器传递给目的控制器:顺传 数据传值: 1.接收方一定要有属性接收 2.传递方必须要拿到接收方 */ /* 1.[self performSegueWithIdentifier] 2.创建segue 3.设置来源控制器segue.sourceViewController = self 4.创建目的控制器,segue.destinationViewController = 目的控制器 5.[self prepareForSegue]跳转之前的准备操作 6.[segue perform] 7.判断下segue的类型,如果是push,拿到导航控制器push [self.navigationController pushViewController:segue.destinationViewController animated:YES]; */ @implementation XMGLoginViewController // 在执行跳转之前的时候调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *vc = segue.destinationViewController; vc.title = [NSString stringWithFormat:@"%@的联系人列表", _accountField.text]; NSLog(@"%@--%@",segue.sourceViewController,segue.destinationViewController); } // 点击了登录按钮的时候调用 // xmg 123 - (IBAction)login:(id)sender { // 提示用户,正在登录ing... [MBProgressHUD showMessage:@"正在登录ing..."]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 隐藏蒙版 [MBProgressHUD hideHUD]; // 验证下账号和密码是否正确 if ([_accountField.text isEqualToString:@"xmg"] && [_pwdField.text isEqualToString:@"123"]) { // 输入正确 // 直接跳转 // 跳转到联系人界面 [self performSegueWithIdentifier:@"login2Contact" sender:nil]; }else{ // 账号或者密码错误 // 提示用户账号或者密码错误 [MBProgressHUD showError:@"账号或者密码错误"]; } }); } // 记住密码开关状态改变的时候调用 - (IBAction)rmbPwdChange:(id)sender { // 如果取消记住密码,自动登录也需要取消勾选 if (_rmbPwdSwitch.on == NO) { // 取消记住密码 // 取消自动登录 [_autoLoginSwitch setOn:NO animated:YES]; } } // 自动登录开关状态改变的时候调用 - (IBAction)autoLoginChange:(id)sender { // 如果勾选了自动登录,记住密码也要勾选 if (_autoLoginSwitch.on == YES) { [_rmbPwdSwitch setOn:YES animated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 给文本框添加监听器,及时监听文本框内容的改变 [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; } // 任一一个文本框的内容改变都会调用 - (void)textChange { _loginBtn.enabled = _accountField.text.length && _pwdField.text.length; NSLog(@"%@--%@",_accountField.text,_pwdField.text); } @end
// // XMGContactViewController.m // 小码哥通讯录 #import "XMGContactViewController.h" @interface XMGContactViewController ()<UIActionSheetDelegate> @end @implementation XMGContactViewController // 点击注销的时候调用 - (IBAction)logout:(id)sender { // 弹出actionSheet UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"是否注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"注销" otherButtonTitles:nil, nil]; [sheet showInView:self.view]; } #pragma mark - UIActionSheetDelegate // 点击UIActionSheet控件上的按钮调用 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { // 点击了注销 [self.navigationController popViewControllerAnimated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { #warning Potentially incomplete method implementation. // Return the number of sections. return 0; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { #warning Incomplete method implementation. // Return the number of rows in the section. return 0; } /* - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath]; // Configure the cell... return cell; } */ /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */ /* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [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 } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji