美文网首页iOS 知识点iOSiOS知识积累
iOS开发之利用Block逆向传值

iOS开发之利用Block逆向传值

作者: YungFan | 来源:发表于2016-12-04 12:24 被阅读9495次

    iOS开发之通过代理逆向传值一文中,分析了利用代理模式来逆向传值,其实还有一些其他的方式,如通知、Block等,相比较代理,我个人认为反而要简单些,但是需要处理好细节问题,如Block循环引用。还是用前文的案例,本次使用Block来实现,Block的基本知识本文不再赘述。

    一、书写规范

    Block传值,需要注意的是,谁传值就需要定义Block,捕获方仅仅需要传递Block给传值方,并处理捕获的值。

    • 传值方
      1、定义Block用于传值
      2、声明一个上述Block属性,这个属性的具体实现需要捕获方传进来
      3、在需要传值的时候调用Block完成传值

    • 捕获方
      1、传递一个Block给传值方
      2、在Block中捕获传过来的值,并根据需求处理捕获的值

    二、Block与逆向传值

    还是那句No Code, No BB,案例效果如下:

    逆向传值.gif

    三、实现步骤

    1、传值方

    //.h 文件
    
    /**
     *  类型自定义
     */
    typedef void (^ReturnValueBlock) (NSString *strValue);
    
    @interface NextViewController : UIViewController
    /**
     *  声明一个ReturnValueBlock属性,这个Block是获取传值的界面传进来的
     */
    @property(nonatomic, copy) ReturnValueBlock returnValueBlock;
    
    @end
    
    =================================================================
    
    //.m 文件
    
    #import "NextViewController.h"
    
    @interface NextViewController ()
    
    @property (weak, nonatomic) IBOutlet UITextField *inputText;
    
    - (IBAction)back:(id)sender;
    
    @end
    
    @implementation NextViewController
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        self.navigationItem.title = @"第二个界面";
    }
    
    
    /**
     *  返回上一个界面
     *
     *  @param sender 按钮
     */
    - (IBAction)back:(id)sender {
    
        NSString *inputString = self.inputText.text;
    
        __weak typeof(self) weakself = self;
    
        if (weakself.returnValueBlock) {
            //将自己的值传出去,完成传值
            weakself.returnValueBlock(inputString);
        }
    
        [self.navigationController popViewControllerAnimated:YES];
        
    }
    
    @end
    

    2、捕获方

    //.m 文件
    
    #import "ViewController.h"
    #import "NextViewController.h"
    
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UILabel *nextPassedValue;
    
    - (IBAction)next:(id)sender;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
        
    }
    
    //点击按钮跳转到第二个界面
    - (IBAction)next:(id)sender {
    
        NextViewController *nvc = [[NextViewController alloc]init];
        
        //赋值Block,并将捕获的值赋值给UILabel
        nvc.returnValueBlock = ^(NSString *passedValue){
            
            self.nextPassedValue.text = passedValue;
        
        };
        
        [self.navigationController pushViewController:nvc animated:YES];
     
    }
    @end
    

    相关文章

      网友评论

      • Vampire_时代:__weak typeof(self) weakself = self;
        位置写错了,应该在第一个界面用吧?
      • 社会主义能见度:block里使用self没有循环引用吗?
      • Sephiroth_Ma:您确定block 块中没有循环引用吗
      • bc973163d996:通俗易懂,见字知意。必须赞一个
        YungFan:@lz_equal 谢谢 :smile:
      • 点雨:浅显易懂, 看了这么多帖子,就你的我看一遍就会使用了! mark
        YungFan:@点雨 谢谢 :smile:
      • wellyoung:strValue 怎么变成 passValue了?
        YungFan:@wellyoung 变量名而已
      • doubleJJ:为什么我的block是null??
      • niujun_iOS:哇,没想到我一说你马上就更新篇blog,大神啊~~
        niujun_iOS:@YungFan 是,就是block经常看到有一些关键字的搞不懂 - -
        YungFan:@niujun_iOS 是不是很简单 :smile:
      • 81288b94f4ec:顺便把循环引用,说下
        YungFan:@我叫小浪子 http://www.jianshu.com/p/51bb714051ea 这篇就够了
      • Rickie_Lambert:朋友 在 芜湖???
        YungFan:@Mr_Rain 对啊 在
      • 死神一护:楼下能不能写个swift版本?
      • H小凡:试了下能不能传多个值,成功了😄
        6b80abe14784:@H小凡 在block的参数里面加就行

      本文标题:iOS开发之利用Block逆向传值

      本文链接:https://www.haomeiwen.com/subject/tjrhmttx.html