03通讯录(Block传值)

//
//  XMGAddViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>

@class XMGContactViewController,XMGContact;

// 利用block传值,需要把什么传递出去,就作为block参数,通常不需要返回值

typedef void(^XMGAddViewControllerBlock)(XMGContact *contact);


@interface XMGAddViewController : UIViewController
@property (nonatomic, strong) XMGAddViewControllerBlock block;
@end
//  XMGAddViewController.m
//  小码哥通讯录
#import "XMGAddViewController.h"
#import "XMGContact.h"


@interface XMGAddViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *phoneField;
@property (weak, nonatomic) IBOutlet UIButton *addBtn;

@end

@implementation XMGAddViewController

// 点击添加的时候调用
- (IBAction)add:(id)sender {
    // 0.把文本框的值包装成联系人模型
    XMGContact *c = [XMGContact contactWithName:_nameField.text phone:_phoneField.text];
   
    // 1.把联系人添加到联系人控制器的数组,让联系人控制器刷新表格
    if (_block) {
        _block(c);
    }
    
    // 2.回到联系人控制器
    [self.navigationController popViewControllerAnimated:YES];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 给文本框添加监听器,及时监听文本框内容的改变
    [_nameField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    [_phoneField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // 主动弹出姓名文本框
    [_nameField becomeFirstResponder];
}

// 任一一个文本框的内容改变都会调用
- (void)textChange
{
    _addBtn.enabled = _nameField.text.length && _phoneField.text.length;
    
}

@end
//
//  XMGContactViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>
@class XMGContact;
@interface XMGContactViewController : UITableViewController

@end
//  XMGContactViewController.m
//  小码哥通讯录
#import "XMGContactViewController.h"
#import "XMGAddViewController.h"
#import "XMGEditViewController.h"
#import "XMGContact.h"
@interface XMGContactViewController ()<UIActionSheetDelegate>

@property (nonatomic, strong) NSMutableArray *contacts;

@end

@implementation XMGContactViewController

- (NSMutableArray *)contacts
{
    if (_contacts == nil) {
        
        _contacts = [NSMutableArray array];
        
    }
    return _contacts;
}

// 跳转之前的时候调用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    
    // 给添加控制器传递联系人控制器属性
    XMGAddViewController *addVc = segue.destinationViewController;
    
    addVc.block = ^(XMGContact *contact){
        // 1.联系人添加到数组
        [self.contacts addObject:contact];
        // 2.刷新表格
        [self.tableView reloadData];
    };
}

// 点击注销的时候调用
- (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];
    
//    // 取消分割线
//    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    // tableView有数据的时候才需要分割线
    
    // 开发小技巧:快速取消分割线
    self.tableView.tableFooterView = [[UIView alloc] init];
    
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.contacts.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    // 创建标示符
    static NSString *ID = @"cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
    }
    
    // 获取模型
    XMGContact *c = self.contacts[indexPath.row];
    
    cell.textLabel.text = c.name;
    cell.detailTextLabel.text = c.phone;
    
    
    return cell;
}


#pragma mark - tableView代理方法
// 点击cell的时候调用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 加载storyboard
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    
    
    // 创建编辑控制器
     XMGEditViewController *editVc = [storyboard instantiateViewControllerWithIdentifier:@"edit"];
    
    
    editVc.contact = self.contacts[indexPath.row];
    editVc.block = ^(){ // 刷新表格
        [self.tableView reloadData];
    };
    
    // 跳转到编辑界面
    [self.navigationController pushViewController:editVc animated:YES];
    
}
@end
//  XMGEditViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>

@class XMGContact;

// 定义block类型别名
typedef void(^XMGEditViewControllerBlock)();

@interface XMGEditViewController : UIViewController

@property (nonatomic, strong) XMGContact *contact;

@property (nonatomic, strong)XMGEditViewControllerBlock block;

@end
//  XMGEditViewController.m
//  小码哥通讯录
#import "XMGEditViewController.h"
#import "XMGContact.h"

@interface XMGEditViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *phoneField;
@property (weak, nonatomic) IBOutlet UIButton *saveBtn;

@end

@implementation XMGEditViewController
// 点击保存的时候调用
- (IBAction)save:(id)sender {
    // 修改模型数据
    _contact.name = _nameField.text;
    _contact.phone = _phoneField.text;
    
#warning TODO:
    // 让小弟做事情,刷新表格
    if (_block) {
        
        _block();
    }
  
    
    // 回到上一个控制器
    [self.navigationController popViewControllerAnimated:YES];
    
}

/*
 控制器之间传值:一定要注意控制器的子控件有没有加载,一定要在子控件加载完成的时候才去给子控件赋值,一般在viewDidLoad给控件赋值。
 
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 设置导航条的标题
    self.title = @"查看/编辑界面";
    
    // 设置导航条右边的按钮
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStyleDone target:self action:@selector(edit:)];
    
    
    // 给文本框
    _nameField.text = _contact.name;
    _phoneField.text = _contact.phone;

    // 给文本框添加监听器,及时监听文本框内容的改变
    [_nameField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    [_phoneField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    
    
    // 判断下登录按钮能否点击
    [self textChange];
    
}

// 任一一个文本框的内容改变都会调用
- (void)textChange
{
    _saveBtn.enabled = _nameField.text.length && _phoneField.text.length;

}


// 点击编辑的时候调用
- (void)edit:(UIBarButtonItem *)item
{
    NSLog(@"%@",item);
    
    if ([item.title isEqualToString:@"编辑"]) {
        // 更改标题
        item.title = @"取消";
        
        // 让文本框允许编辑
        _nameField.enabled = YES;
        _phoneField.enabled = YES;
        
        // 弹出电话文本框的键盘
        [_phoneField becomeFirstResponder];
        
        // 显示保存按钮
        _saveBtn.hidden = NO;
        
       
    }else{
        // 更改标题
        item.title = @"编辑";
        
//        // 退出键盘
//        [self.view endEditing:YES];
        
        // 隐藏保存按钮
        _saveBtn.hidden = YES;
        
        // 让文本框不允许编辑
        _nameField.enabled = NO;
        _phoneField.enabled = NO;
        
        // 还原数据
        _nameField.text = _contact.name;
        _phoneField.text = _contact.phone;
    }
   
}

- (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
//
//  XMGLoginViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>

@interface XMGLoginViewController : UIViewController

@end
//  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];
    
    
    // 判断下登录按钮能否点击
    [self textChange];
    
}

// 任一一个文本框的内容改变都会调用
- (void)textChange
{
    _loginBtn.enabled = _accountField.text.length && _pwdField.text.length;
    NSLog(@"%@--%@",_accountField.text,_pwdField.text);
}


@end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji
原文地址:https://www.cnblogs.com/laugh/p/6649923.html