问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios 判断有没有实现代理协议

发布网友 发布时间:2022-05-15 20:16

我来回答

1个回答

热心网友 时间:2024-02-27 15:13

【iOS开发技术分享】协议与代理
【iOS开发技术分享】协议与代理

一、理解协议与代理

协议:

协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。

代理:

代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。

二、协议的使用

在定义协议时,可以通过@required与@optional来配置遵守这个协议必须去实现的方法和可以选择的方法。譬如:

@protocol MyChooseDayViewDelegate<NSObject>
@required
- returnChooseDay:(id)myChooseDayView;
@optional
- hideThisView;
- changeDateFormatter:(NSString*)formatString;
@end
在定义的协议 MyChooseDayViewDelegate中,如果遵守该协议,就必须实现协议中的- returnChooseDay: 方法,同时可以根据实际程序要求去实现- hideThisView 与 - changeDateFormatter: 。

同时,协议支持对本身的一种扩展,譬如:

@protocol MyChooseTimeViewDelegate< MyChooseDayViewDelegate>
- doSomething;
@end
MyChooseTimeViewDelegate
扩展了MyChooseDayViewDelegate这个协议,也就是说,假如遵守了MyChooseTimeViewDelegate的话,也必须实
现MyChooseDayViewDelegate中的方法(@required)使用分类的话,就是在定义类的头文件中使用<>
将所需要的协议引入,如果引入多个协议,用","分隔,譬如:

@interface MyClassView:UIViewController <MyChooseDayViewDelegate, UIAlertViewDelegate>
//TODO: balabalabala...
@end

想要检查某个类是否实现了某个协议或者某个类是否实现了某个协议的方法,可以通过以下方式来进行测试

//获取某个对象
MyClassView *myClassView = xxxxxxx;
//判断该对象是否实现了MyChooseDayViewDelegate协议
if([myClassView conformToProtocol:@protocol (MyChooseDayViewDelegate)]){
//TODO: balabalabala...
}
//判断对象是否实现了某个方法就用我们经常会使用到的
if([myClassView responseToSelector:@selector(xxxx)]){
//TODO: balabalabala...
}

三、代理
代理在iOS开发会被经常使用,而且代理的使用往往配合着协议。我重复一次我对他的理解,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。
举例来说,我在办公室里正在写代码,突然发现口
很渴像喝瓶冰百事,但下楼是件麻烦的事情,我不愿意下楼。这个时候我想起小卖部可以商品加价2元就外送到家服务,我就打电话给小卖部,委托小卖部给我送一
瓶水上来。这个时候,小卖部就是我的代理,我委托他帮买水并送上来。这个例子中小卖部是我的代理,商品加价2元外送到家服务就是商品买卖协议(这个叫法肯
定不是最佳的,姑且这么叫吧)中的一个方法。
不要觉得麻烦,我们再最后理一遍,小卖部遵守商品买卖协议,我让小卖部成为了我的代理,代替我完成了买瓶冰百事的事情。
以iOS开发的角度来说,UIViewController想使用一个tableview,需要遵守UITableviewDataSource,UITableViewDelegate这2个协议,同时设置tableview的代理为自身,才可以完整的实现Table。

四、代理与协议的使用
我尽可能的用代码来进行描述,但首先需要进行一些context铺垫
我想实现的功能:我要自定义一个View,这个
view可能展示了我自己项目中特定的一些信息,它可能是若干控件的组合,譬如UITextField、UISwitch、UIDatePicker、
balabalabala...我们姑且叫这个view为myInformationView 我在一个ViewController使用了这个
view,为了方便,这个ViewController就叫myRootViewController。在使用这个myInformationView
时,我需要即时的在myRootViewController获取并做相应的处理。这是我想实现的功能。
接下来,就是开始写代码的时刻:
1.首先是一个protocol

#import <Foundation/Foundation.h>
@class MyInformationView;

@protocol MyInformatioViewDelegate<NSObject>
@required
@returnValueToShow:(MyInformationView*)myInformationView;

@end

2.MyInformationView

#import <UIKit/UIKit.h>

@interface MyInformationView : UIView

@property (nonatomic, strong) id<MyInformationViewDelegate> myDelegate;

- (id)initWith......//初始化视图的方法
//所需要的属性和方法根据实际需要再行添加
@end
#import "MyInformationView.h"
@interface MyInformationView()

@end

@implementation MyInformationView
@synthesize myDelegate = _myDelegate;

//Todo: 处理一些初始化方法和其他一些事件

// changeMyInformationData 是操作此view可能产生的数据变动。它可能是选择器变动、点击按钮等等,但我们并不想在此view处理它,因为它的变动可能对调用此view的controller造成影响,所以...
- (void) changeMyInformationData:(id)sender

//TODO:数据变动....
if ([self.myDelegate respondsToSelector:@selector(returnValueToShow:)]) {
[self.myDelegate returnValueToShow:self];
}


@end

3.ViewController
这里就不写代码了,在头文件中声明此类遵守MyInformationViewDelegate协议。在实现文件(.m)中,调用MyinfomationView的时候,设置代理成自己,
MyInformation *myInfoView = [[MyInformation alloc] init.......];
myInfoView.myDelegate = self;
然后实现协议中要求实现的方法

- (void)returnValueToShow:(MyInformationView*)myInfoView
{
//TODO:做想做的事情
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
缘起缘灭美文 个人取得交易手续费返还收入需缴个人所得税吗 个人所得税返还手续费交增值税吗 输血有什么不良反应? 总是梦见很恐怖的快速飞 梦里面还知道自己在做梦想赶紧醒来 问题... 武汉商学院地址是什么 武汉商学院交通方便吗。离市区远吗 武汉商学院地理位置很偏吗 ...2013年10月10日, 农历2013年9月6日, 阴历二零一三癸巳年九月初六日12... 男孩 出 生于2013年10月10日(农历九月初六)凌晨3:07分五行缺什么啊? uislider怎么控制步长ios ios 中拖动uislider到某个地方两边颜色变成一样了怎么回事 uiswitch 不能点击怎么设置 ios uiswitch 能设置off tint吗 ios uiswitch怎么用自定义的 ios tableviewcell上添加uiswitch控件 怎么控制控件的状态 ios9 uiswitch可以缩小吗 ios怎么获取到表上的uiswitch的值 ios 为什么无法UISwitch的高宽 ios 怎么记录uiswitch按钮的选择状态 ios 怎么定义uiswitch 请问一下这opp手机进水后屏幕花了还能恢复吗?? 萤火虫和星星都是一样的闪闪发光,可是为什么一个可以触碰,一个却只能仰望? 金立手机如何辨别真假? 怎么辨别金立手机的真伪 三星s6突然不能直充只能无线充是怎么回事,关机充电时显示一下电池图 阿里巴巴上卖的无线充电器是真实的吗 我的金立手机可以配无线充电器不是万能充 【手机无线充电器】支持所有手机 方便时尚 万能无线充电器发射器怎么使用青橙手机可以使用吗 2013中行贷款28万,贷15年请问月供是多少,总利息是多少。。。 急性胃扩张 患急性胃扩张有什么原因? 患者出现急性胃扩张的救治措施有哪些? 求解答,急性胃扩张有什么好的治疗方法吗?有胃达康可以吗? 急性胃扩张的病因 胃扩张是什么原因造成的 性胃扩张应该怎么治疗 最近发现有人得了急性胃扩张死了 挺吓人的 这个病有没有办法预防或者能看好吗? 性胃扩张有哪些表现 4招治急性胃扩张 请问胃扩张怎么治疗 人体急性胃扩张有哪些症状? 婴幼儿4个月胃扩张什么意思? 性胃扩张怎么办 急性胃扩张的处理 如何预防兔急性胃扩张? 急性胃扩张时胃泡鼓音区是增大还是缩小? 翼装的发展历史 前几天看了一电视,讲述的是滑翔伞的冠军张树鹏的故事,想让孩子看看,但记不住是哪个台和节目单了,有请高手 中国人敢翼装飞行吗? 翼装飞行 那个飞行服国内是不是买不到 要进口买啊大概多少钱 中国大陆哪里能玩高空滑翔伞