OC-协议

协议(Protocol)是多个类共享的一个方法列表,在协议中列出的方法,在定义协议的类中并没有给出具体的实现,而协议的实现的功能是在遵守协议的类中定义的。通过协议可以实现对象之间的通信,同时又能够使类的定义更加通用。也就是说,遵守同一协议的类,针对协议中定义的方法,可以在类中实现不同的功能。例如,当一个视图View类的对象被单击时,在不同的控制器Controller类中可以定义不同的响应方法。

1.为什么需要协议

协议用来解决对象之间通信问题,特别是当视图类对象向控制器类对象通信(发送用户点击动作、请求设置视图数据)时,常使用协议。通过协议可以进一步提升该类的通用性,例如,对于某个按钮的点击动作,在所有遵守协议的对象中,可以定义不同的动作。

2.协议的种类:在iOS开发中,可以定义各种各样的协议,常见的有代理协议、数据源协议等。

3.协议的实现步骤

协议的实现相对复杂,但步骤都是统一的。当需要实现协议时,可以按照如下的步骤一步步添加相关的代码,总体来说包括3个核心步骤:

添加协议,并设置协议中包含的方法,同时添加一个属性用于设置遵守协议的对象。
设置触发执行协议中方法的时机,例如发生了用户点击事件。
在遵守协议的类中,实现协议中方法的具体功能。

///

1.代理协议在iOS开发中,经常使用到代理协议(Delegate)以及数据源协议

所谓代理协议,例如,用户单击了一个子控件上的按钮,这时可以委托控制器去处理一些事物或实现一些功能,例如切换到新的控制器或者发送一个网络请求等。
代理协议的实现:在自定义视图类MYView.h文件中:设置类引用@class、定义代理协议名称、定义代理协议中包含的方法、添加代理属性(注意使用weak属性)。

#import <UIKit/UIKit.h>
@class MYView;
#protocol MyViewDelegate <NSObject>
-(void) myView:(MYView *)myView clickMYButtonShowAlert:(NSString *)message;
@end
@interface MYView : UIView
@property (nonatomic, weak) id <MyViewDelegate>delegate;
@end

在MYView.m文件中,监听代理协议定义事件的发生。当事件发生时,通知遵守代理协议的对象(如控制器)去工作,即设置在实现代理协议的类中,代理协议方法执行的时机。

-(void)touchesBegan:(NSSet<UITouch *>)touches withEvent:(UIEvent *)event{
    if([self.delegate respondsToSelector:@selector(myView:clickMYButtonShowAlert:)]) {
        [self.delegate myView:self clickMYButtonShowAlert:@"视图被点击了"];
    }
}

在需要遵守代理协议的类中,引用头文件并遵守代理协议,遵守代理协议需要在类的接口部分使用<>符号来声明该类需要遵守的协议,同一个类可以遵守多个协议。

#import "MYView.h"
@interface ViewController()<MyViewDelegate>
@property (nonatomic, strong) MYView *myView;
@end

设置代理对象

-(MYView *)myView {
    if (_myView == nil) {
        _myView = [[MYView alloc] init];
        _myView.frame = CGrectMake(0, 500, 320, 50);
        _myView.backgroundColor = [UIColor yellowColor];
        _myView.delegate = self;
    }
    return _myView;
}
-(void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubView:self.myView];
}

实现协议方法,即当触发条件发生时,执行的动作。

-(void)myView:(MYView *)myView clickMYButtonShowAlert:(NSString *)message {
    NSLog(@"%s", __func__);
    NSLog(@"传递的消息是:%@", meassage);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值