iOS-delegate(代理/委托)

关于delegate的理解:是一种设计模式即代理模式,可以去参考中介找房案例来理解代理模式,说一下个人的理解吧:我理解的代理模式就是我需要做一件事但是我又没有时间或者有一部分条件并不具备,所以我需要别人来完成,而我需要告诉他我要做什么,至于如何让完成是他的事情

代理最常用的的用法就是逆向传值,下面通过一个小demo来看一下具体怎么用

实现的功能:我有两个页面,我先当前VC: MeViewController 通过按钮跳转到下一个VC:TestViewController,该VC上面三个按钮,每当我点击一个按钮是退回到上一个VC,并且在 VC: MeViewController 的label上显示我点击的按钮是第几个,即将我点击的按钮的值传递给上一个界面。

代码实现:

1.创建协议

//import "TestViewController.h":

@protocol TestViewControllerDelegate <NSObject>

// 让协议方法带参传值

/**传递的值*/

- (void) showMeTarget:(NSInteger ) value;

@end

2.声明委托变量

//import "TestViewController.h":

@interface TestViewController : UIViewController

@property (nonatomic, weak) id <TestViewControllerDelegate> delegate;

@end

至于为啥用weak 以后说到内存管理再说

3.设置代理 因为我是在MeViewController里面跳转的时候设置的,所以在MeViewController.h中

// #import "MeViewController.h"

- (void)jumpButtonDidClick {

    TestViewController *vc = [[TestViewController alloc]init];

    vc.title = @"跳转页面";

    vc.delegate = self;

    [self.navigationController pushViewController:vc animated:YES];

}

4.利用委托变量来调用协议方法,也就是将值传递过去让代理者开始执行协议

//import "TestViewController.h":

- (void) buttonDidClick:(UIButton *)btn {

    if([self.delegate respondsToSelector:@selector(showMeTarget:)])   {

        [self.delegate showMeTarget:btn.tag];

    }

    [self.navigationController popViewControllerAnimated:YES];

}

5.在代理MeViewController中遵守协议

@interface MeViewController ()<TestViewControllerDelegate,NSURLSessionDataDelegate>

@property (nonatomic,strong) UIButton *jumpButton;

@property (nonatomic,strong)UILabel *label;

@end

6.代理实现协议方法

- (void)showMeTarget:(NSInteger)value {

    self.label.text = [NSString stringWithFormat:@"点击了第%ld个按钮",value];

}

嗯,看一下效果:


为作跳转前的MeViewController


按钮页面


传值完成
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容