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:做想做的事情
}  

这样就是一整套完整的代理与协议组合用法了。但其实代理与协议还可以做更多的事情,例如在页面切换时(A页面进入AA页面)...通过传入,使AA成A的代理,并对其进行操作来方便处理一些问题。

时间: 2024-10-09 01:10:37

ios开发之代理&&协议(补充篇)的相关文章

iOS开发——完整项目实战OC篇&amp;百思不得姐第四天

iOS开发——完整项目实战OC篇&百思不得姐第四天 上午 一:自定义按钮使用九宫格布局 二:控件不能点击 三:获取用户点击了那个按钮 四:调整按钮内部控件的位置:主流->上下 五:不能直接使用self.navigationController中或者View中获取导航控制器 方法一: 方法二: 六:布局取整 1 // 总行数 2 3 // NSUInteger rows = sqaures.count / maxCols; 4 5 // if (sqaures.count % maxCols)

IOS开发之——Protocol协议的使用

protocol ['pr?ut?k?l] (例子:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一.说明 两个类进行通讯,用协议就比较方便. 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议. 4.协议经常用来实现委托对象.一个委托对象是一种用来协同或者代表其他对象的特殊对象. 5:委托,就是调用自己定义方法,别的类来实

iOS开发之多线程技术——NSOperation篇

本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation 1.自定义NSOperation 2.NSOperation的基本使用 3.NSOperation实现线程间通信 1)利用代理进行消息传递 2)利用通知实现消息传递 3)利用block进行消息传递 四.与GCD比较 一.什么是NSOperation NSOperation是一个抽象的基类,表示一个独

聊聊 iOS 开发中的协议

前言 何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性.方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category.在日常开发中,协议可谓无处不在,最为核心的UITableView通过协议来获取数据.完成事件处理等.下面就是一个最粗浅的协议 @protocol CustomProtocol - (void)doSomething; @end 对于协议的理解,很多的开发者依旧保留在委托-代理等于协议等认知上.然而前者

【iOS开发】代理(delegate)

代理是iOS开发中常用的设计模式.我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式. 什么是代理? 苹果的官方文档给了很清晰的解释: Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegatin

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa

iOS开发——网络使用技术OC篇&amp;网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

iOS开发——高级技术精选OC篇&amp;Runtime之字典转模型实战

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

ios开发——常用经典算法OC篇&amp;冒泡/快速

冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于排序的,当然如果你是做游戏的话那么你可能会涉及到不少的算法或者优化问题,但是这不是本篇文章讨论的范围. 后面的文章中,我将会给大家详细介绍八大算法. 2.冒泡排序 2.1 引出 前面的两篇博客里讲的插入排序是基于“逐个记录插入”,选择排序是基于“选择”,那么冒泡排序其实是基于“交换”.每次从第一个记