iOS 代理的基本使用

2017-07-04  本文已影响0人  CJ_BLUE

简介

代理在开发过程中比较常见,像<UITableViewDelegate>就是系统自带的协议,代理一般用来页面间传值,传递事件,接下来通过页面间传值来简单讲一下代理的使用方法。

页面间传值

首先明确一下目的,A控制器跳转到B控制器,再从B控制跳转回来,并且带回一个值。

第一步:在B控制器声明一份协议
@protocol BViewControllerDelegate <NSObject>// 一般用控制器名+Delegate命名

- (void)returnString:(NSString *)str;// 代理方法 返回一个字符串

@end
第二步:声明一个代理属性
@property (nonatomic, weak) id<BViewControllerDelegate> delegate;
第三步:在跳转回A控制的方法里写代理执行方法(这里用了模态跳转)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 判断代理方法是否存在
    if ([self.delegate respondsToSelector:@selector(returnString:)]) {
        [self.delegate returnString:@"回传数据"];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
第四步:在A控制器里签订代理
@interface ViewController () <BViewControllerDelegate>
第五步:签订代理人
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    BViewController *VC = [BViewController new];
    VC.delegate = self; // 这步是签订代理人
    [self presentViewController:VC animated:YES completion:nil];
}
第六步:实现代理方法
- (void)returnString:(NSString *)str
{
    NSLog(@"%@", str);
}

这样一个代理传值就写完了,能实现页面间的传值,下面我们来想一下,如果一个页面可以跳转到多个页面,就像首页,而且返回的时候都要做不同的动作(例如:刷新数据,更新某个UI,等等),那么所有页面都写一个代理的话,首页就需要实现多个代理方法,这可能不是我们想要的,接下来就来讲讲Protocol文件。

首先创建一个Objective-C File文件


屏幕快照 2017-07-04 下午1.59.00.png

然后文件类型选择Protocol


屏幕快照 2017-07-04 下午1.59.46.png
创建出来的文件只有.h文件,然后写上代理方法,这个文件就结束了。
@protocol DoSomething <NSObject>

- (void)doSomethingWith:(NSString *)type;

@end

然后去需要回调的控制器(还是用上面提到的B控制器)引入头文件,之后从声明代理属性开始,之后步骤都一样,就不多说了,直接贴代码

#import "DoSomething.h" // 引头文件
@property (nonatomic, weak) id<DoSomething> doDelegate; // 声明代理属性
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 调用代理方法
    if ([self.doDelegate respondsToSelector:@selector(doSomethingWith:)]) {
        [self.doDelegate doSomethingWith:@"回调"];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
@interface ViewController () <DoSomething> // 签订代理
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    BViewController *VC = [BViewController new];
    VC.doDelegate = self; // 签订代理人
    [self presentViewController:VC animated:YES completion:nil];
}
// 实现代理方法
- (void)doSomethingWith:(NSString *)type
{
    NSLog(@"%@", type); // 
}

代理方法里可以根据不同的type来进行不同的操作,这样多个控制器就可以共用一个代理方法了。

结语:限于水平,本文只写了一些基本用法和注意事项,如果文中存在错误请指出,我会及时修改。

上一篇 下一篇

猜你喜欢

热点阅读