• Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)


    需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回的时候,在ViewController的Label上面显示文字内容,

    (1)第一种方法:首先看看通过“协议/代理”是怎么实现两个页面之间传值的吧,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //NextViewController是push进入的第二个页面
    //NextViewController.h 文件
    //定义一个协议,前一个页面ViewController要服从该协议,并且实现协议中的方法
    @protocol NextViewControllerDelegate <NSObject>
    - (void)passTextValue:(NSString *)tfText;
    @end
     
    @interface NextViewController : UIViewController
    @property (nonatomic, assign) id<NextViewControllerDelegate> delegate;
     
    @end
     
    //NextViewController.m 文件
    //点击Button返回前一个ViewController页面
    - (IBAction)popBtnClicked:(id)sender {
        if (self.delegate && [self.delegate respondsToSelector:@selector(passTextValue:)]) {
            //self.inputTF是该页面中的TextField输入框
            [self.delegate passTextValue:self.inputTF.text];
        }
        [self.navigationController popViewControllerAnimated:YES];
    }

    接下来我们在看看ViewController文件中的内容,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //ViewController.m 文件
    @interface ViewController ()<NextViewControllerDelegate>
    @property (strong, nonatomic) IBOutlet UILabel *nextVCInfoLabel;
     
    @end
    //点击Button进入下一个NextViewController页面
    - (IBAction)btnClicked:(id)sender
    {
        NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil];
        nextVC.delegate = self;//设置代理
        [self.navigationController pushViewController:nextVC animated:YES];
    }
     
    //实现协议NextViewControllerDelegate中的方法
    #pragma mark - NextViewControllerDelegate method
    - (void)passTextValue:(NSString *)tfText
    {
        //self.nextVCInfoLabel是显示NextViewController传递过来的字符串Label对象
        self.nextVCInfoLabel.text = tfText;
    }

    这是通过“协议/代理”来实现的两个页面之间传值的方式。

    (2)第二种方法:使用Block作为property,实现两个页面之间传值,

    先看看NextViewController文件中的内容,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //NextViewController.h 文件
    @interface NextViewController : UIViewController
    @property (nonatomic, copy) void (^NextViewControllerBlock)(NSString *tfText);
     
    @end
    //NextViewContorller.m 文件
    - (IBAction)popBtnClicked:(id)sender {
        if (self.NextViewControllerBlock) {
            self.NextViewControllerBlock(self.inputTF.text);
        }
        [self.navigationController popViewControllerAnimated:YES];
    }

    再来看看ViewController文件中的内容,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - (IBAction)btnClicked:(id)sender
    {
        NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil];
        nextVC.NextViewControllerBlock = ^(NSString *tfText){
            [self resetLabel:tfText];
        };
     
    //  [nextVC setNextViewControllerBlock:^{
    //    [self resetLabel:tfText];
    //  }];
        [self.navigationController pushViewController:nextVC animated:YES];
    }
    #pragma mark - NextViewControllerBlock method
    - (void)resetLabel:(NSString *)textStr
    {
        self.nextVCInfoLabel.text = textStr;
    }

    好了就这么多代码,可以使用Block来实现两个页面之间传值的目的,实际上就是取代了Delegate的功能。

  • 相关阅读:
    Laravel使用Eloquent ORM操作数据库
    Laravel查询构造器的使用方法整理
    [wordpress]后台自定义菜单字段和使用wordpress color picker
    Thinkphp kindeditor 内容转义
    WordPress 后台提示输入FTP信息
    [记录]gulp compass
    symonfy 项目根目录下没有 bin/console 文件的解决方法
    [gulp] gulp lint 忽略文件
    [转载]ubuntu Atheros Communications Device 1083 驱动
    SharpDevelop 编译时,任务失败,因为未找到“resgen.exe”的解决方法
  • 原文地址:https://www.cnblogs.com/lrr0618/p/5473717.html
Copyright © 2020-2023  润新知