iOS 协议实现传值和回调
在上一篇中介绍了iOS中的协议及其用法,本篇记录iOS中用协议实现反向传值和回调的用法
反向传值
使用协议代理实现传值:协议带参数[委托方通过协议中的方法(含参数的协议方法)将要传的值传到代理方]
实例讲解:上一级界面(YHGreenInterface)显示下一级界面(YHYellowInterface)的内容.下一级界面想要将自己的内容显示在上一级界面, 但是自己做不到, 需要上一级界面来帮他完成
在YHGreenInterface.h中声明带参数的协议方法and代理属性
#import <Foundation/Foundation.h> @protocol GreenInterfaceDelegate <NSObject> // 让协议方法带参传值 /**传递的值*/ - (void) showAppointValue:(NSString *) value; @end
/**绿色界面*/ @interface YHGreenView : NSObject
/**需要的代理*/ @property (nonatomic, weak) id <GreenInterfaceDelegate> delegate;
/**传递需要显示的数据*/ - (void) deliverValue:(NSString *) value; @end
在YHGreenInterface.m中判断是否实现了传值方法
#import "YHGreenView.h" @implementation YHGreenView - (void) deliverValue:(NSString *) value { if ([self.delegate respondsToSelector:@selector(showAppointValue:)]) { [self.delegate showAppointValue:value]; } else { NSLog(@"无法传值"); } } @end
在YHYellowInterface.h遵守协议
#import <Foundation/Foundation.h> #import "YHGreenView.h" // 遵守协议, 实现协议方法 /**黄色界面*/ @interface YHYellowView : NSObject <GreenInterfaceDelegate> @end
在YHYellowInterface.m实现做遵守协议要求实现的方法
#import "YHYellowView.h" @implementation YHYellowView // 实现协议方法, 打印指定内容 - (void) showAppointValue:(NSString *) value { printf("显示: %s", [value UTF8String]); } @end
在main.m中创建绿色和黄色两个view,把黄色的设置为绿色的代理然后调用绿的页面的传值方法
#import <Foundation/Foundation.h> #import "YHYellowView.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 绿色界面委托 YHGreenView *GreenView = [[YHGreenView alloc] init]; // 黄色界面代理 YHYellowView *YellowView = [[YHYellowView alloc] init]; //将黄色界面设置为绿色界面的代理 GreenView.delegate = YellowView; // 显示输入的内容 printf("输入要显示的值:"); char a[100]; fgets(a, 101, stdin); // 传值 [GreenView deliverValue:[NSString stringWithUTF8String:]]; } return 0; }
回调
使用协议实现代理实现回调就是通过带有返回值的协议方法,将数据从代理方传递到委托方
看下面实例:显示类要显示网络上的数据.显示类需要下载类下载数据然后把数据传递到显示类中显示
在这个实例中委托方是显示类;代理方是下载类;协议是数据下载方法
在YHShow.h中声明数据下载协议
#import <Foundation/Foundation.h> @protocol downloadDelegate <NSObject> /**下载指定路径下的数据*/ - (NSData *) downloadDataWithURL:(NSString *) urlStr; @end // 1. 委托 /**委托*/ @interface YHShow : NSObject /**代理对象*/ @property (nonatomic, weak) id <downloadDelegate> delegate; /**要求代理下载数据*/ - (void) needShow; @end
在YHShow.m中实现要求代理方实现的方法的实现
#import "YHShow.h" @implementation YHShow - (void) needShow { if ([self.delegate respondsToSelector:@selector(downloadDataWithURL:)]) { NSData *data = [self.delegate downloadDataWithURL:@"http://blog.csdn.net/jingling/article/details/47753189"]; NSLog(@"显示下载的数据%@", data); } } @end
在YHDownload.h中遵守协议
#import <Foundation/Foundation.h> #import "YHShow.h" /**代理*/ @interface YHDownload : NSObject <downloadDelegate> @end
在YHDownload.m实现协议中的下载方法
#import "YHDownload.h" @implementation YHDownload - (NSData *) downloadDataWithURL:(NSString *) urlStr { // 获取指定网络路径中的数据 // 创建统一资源定位符对象 NSURL *url = [NSURL URLWithString:urlStr]; NSData *data = [NSData dataWithContentsOfURL:url]; return data; } @end
在main.m文件中创建显示类,创建下载类,设置下载类为显示类的代理,执行委托代理方法
#import <Foundation/Foundation.h> #import "YHDownload.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 1.创建一个显示对象 YHShow *show = [[YHShow alloc] init]; // 2.创建一个下载对象 YHDownload *download = [[YHDownload alloc] init]; // 3.设置代理 show.delegate = download; // 4.开始下载 [show needShow]; } return 0; }