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;
  }

 

posted @ 2017-04-12 13:46  MK_monster  阅读(1993)  评论(0编辑  收藏  举报