• iOS:使用block进行类与类,控制器与控制器之间的传值


    介绍:在iOS中类与类,控制器与控制器之间传值的方式有多种,分别是:单例传值、代理传值、通知传值、block传值或者一些偏好设置也可以用来传值。。。。

    每一种传值方式都有各自的优点和缺点,针对不同情况选择符合需要的方式进行传值。这里我比较喜欢block方式传值,个人觉得简单好用,省却了不少代码。

    下面简单给一个在控制器之间FirstViewControllerSecondViewController使用block传值的例子:

    SecondViewController中:

    SecondViewController.h文件

    //
    //  SecondViewController.h
    //  block传值
    //
    //  Created by mac on 16/3/16.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    /**
     *  定义一个block别名,方便使用,该block返回值为void类型,有一个参数为字符串类型
     */
    typedef void (^ReturnValueByBlock)(NSString *text);
    
    
    @interface SecondViewController : UIViewController
    /**
     *  声明一个block变量
     */
    @property (copy,nonatomic)ReturnValueByBlock returnBlock;
    
    
    /**
     *  声明一个实例方法,block代码块作为参数
     */
    -(void)returnValue:(ReturnValueByBlock) block;
    @end

    SecondViewController.m文件

    //
    //  SecondViewController.m
    //  block传值
    //
    //  Created by mac on 16/3/16.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "SecondViewController.h"
    
    @interface SecondViewController ()
    
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //返回
        self.view.backgroundColor = [UIColor greenColor];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back:)];
    }
    
    //返回
    -(void)back:(UIBarButtonItem *)sender{
        
        [self.navigationController popViewControllerAnimated:YES];
        
        //给block参数赋值
        self.returnBlock(@"我是中国人!");
    }
    
    //通过实例方法回传值
    -(void)returnValue:(ReturnValueByBlock)block{
        self.returnBlock = block;
    }
    @end

    FirstViewController中:

    FirstViewController.m文件

    //
    //  ViewController.m
    //  block传值
    //
    //  Created by mac on 16/3/16.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "FirstViewController.h"
    #import "SecondViewController.h"
    
    @interface FirstViewController ()
    @end
    
    @implementation FirstViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //创建按钮
        UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        btn.center = self.view.center;
        btn.backgroundColor = [UIColor redColor];
        [btn setTitle:@"入栈" forState:UIControlStateNormal];
        [btn addTarget:self action:@selector(push:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
    }
    
    //入栈
    -(void)push:(UIButton *)sender{
    
        SecondViewController *secondVC = [[SecondViewController alloc]init];
        [self.navigationController pushViewController:secondVC animated:YES];
        
        //接收回传的值
        [secondVC returnValue:^(NSString *text) {
            NSLog(@"%@",text);
        }];
    }
    @end

    每次返回时打印结果:

    2016-03-16 20:41:45.762 block传值[6511:271329] 我是中国人!
  • 相关阅读:
    正则表达式获取远程网页
    Devexpress 常见问题
    CSS 带显示隐藏左部页面按钮
    CSS 技巧积累
    SQL 常用操作
    重置 自增字段 起始值 和 步长
    Devexpress TreeList
    Devexpress GridControl
    JS常用
    ajax跨域请求
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/5285088.html
Copyright © 2020-2023  润新知