iOS - Delegate 代理

简介: 1、Delegate1.1 协议协议:是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划由其他人来实现。协议中列出的方法,有些是可以选择实现,有些是必须实现。1>、如果你定义了自己的协议,那么不必由自己实现它。

1、Delegate

1.1 协议

  • 协议:是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划由其他人来实现。协议中列出的方法,有些是可以选择实现,有些是必须实现。

    • 1>、如果你定义了自己的协议,那么不必由自己实现它。但是,这就告诉其他程序员,如果要采用这项协议,则必须实现这些方法。这些方法可以从超类继承。

      • 协议不引用任何类,它是无类的。

      • 分类也可以采用一项协议。

    • 2>、定义一个协议很简单:只要使用 @protocol 指令,后面跟上你给出的协议名称。定义一项协议时,可以扩展现有协议的定义。

          @protocol PlayerDelegate <NSObject>
      
          - (void)end;
      
          @end
    • 3>、协议的修饰

          @optional:该指令之后列出的所有方法都是可选的。
          @required:该指令之后列出的所有方都是必须实现的,默认。由于 OC 是弱语法,虽然字面上是必须,但编译器并没有强求实现。
    • 4>、协议的声明

          @protocol  protocol-name
    • 5>、协议的检查

          // 检查一个对象是否遵守某项协议。
          - (BOOL)conformsToProtocol:(Protocol *)aProtocol;
      
              // 用于获取一个协议名称,并产生一个 Protocol 对象,conformsToProtocol: 方法期望这个对象作为它的参数。
              @protocol(Drawing)
      
          // 检查对象是否能够响应 selector 所指定的方法。
          - (BOOL)respondsToSelector:selector
      
              // 为名为 alloc 的方法生成一个 SEL 类型的值。
              @selector(alloc)

1.2 非正式协议

  • 非正式协议:实际上是一个分类,列出了一组方法但并没有实现它们。非正式协议通常是为根类定义的,有时,非正式协议也称为抽象协议。

    • 声明非正式协议的类自己并不实现这些方法,并且选择实现这些方法的子类需要在它的接口部分重新声明这些方法,同时还要实现这些方法中的一个或多个。

    • 指令 @optional 添加到 OC 2.0 语言中,用于取代非正式协议的使用。

1.3 代理

  • 代理:协议也是一种两个类之间的接口定义。定义了协议的类可以看作是将协议定义的方法代理给了实现它们的类。

    • 代理设计模式的作用:
      • 1、A 对象监听 B 对象的一些行为,A 成为 B 的代理
      • 2、B 对象想告诉 A 对象一些事情,A 成为 B 的代理
    • 代理设计模式的总结:
      • 1、如果你想监听别人的一些行为,那么你就要成为别人的代理
      • 2、如果你想告诉别人一些事情,那么就让别人成为你的代理
    • 代理设计模式的开发步骤:
      • 1、拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是 @optional)
      • 2、声明一个代理属性:@property (nonatomic, weak) id delegate;
      • 3、在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
      • 4、设置代理:xxx.delegate = yyy;
      • 5、yyy 对象遵守协议,实现代理方法
    • 代理和通知的区别:
      • 代理:1 个对象只能告诉另 1 个对象发生了什么事
      • 通知:1 个对象可以告诉 N 个对象发生了什么事

2、代理传值

2.1 代理反向传值

  • 代理 - 反向传值

    • 1、创建代理协议,并在协议中创建协议方法

    • 2、委托方:发送方,包含协议头文件
    • 3、委托方:发送方,创建代理人属性变量
    • 4、委托方:发送方,调用协议方法,发送传递值

    • 5、代理方:接收方,遵守代理协议
    • 6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
    • 7、代理方:接收方,实现代理协议中的方法,接收传递值

  • Objective-C

    • PageDelegate1.h

          #import <Foundation/Foundation.h>
      
          @protocol PageDelegate1 <NSObject>
      
          // 1、创建代理协议,并在协议中创建协议方法
          - (void)setLabelWithText:(NSString *)protocolText;
      
          @end
    • Page8.h

          // 2、委托方:发送方,包含协议头文件
          #import "PageDelegate1.h"
      
          // 3、委托方:发送方,创建代理人属性变量
          @property(nonatomic, weak)id<PageDelegate1> delegate;
    • Page8.m

          if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) {
      
              // 4、委托方:发送方,调用协议方法,发送传递值
              [self.delegate setLabelWithText:sendTextFiled.text];
          }
    • Page7.m

          // 5、代理方:接收方,遵守代理协议
          @interface Page7 () <PageDelegate1>
      
          // 6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
          Page8 *pvc8 = [[Page8 alloc] init];
      
          pvc8.delegate = self;
      
          // 7、代理方:接收方,实现代理协议中的方法,接收传递值
          - (void)setLabelWithText:(NSString *)protocolText {
      
              receiveLabel.text = protocolText;
          }
  • Swift

    • PageDelegate1.swift

          import Foundation
      
          protocol PageDelegate1 {
      
              // 1、创建代理协议,并在协议中创建协议方法
              func setLabelWithText(protocolText:String?)
          }
    • Page8.swift

          // 3、委托方:发送方,创建代理人属性变量
          var delegate:PageDelegate1!
      
          if self.delegate != nil {
      
              // 4、委托方:发送方,调用协议方法,发送传递值
              self.delegate.setLabelWithText(sendTextFiled.text)
          }
    • Page7.swift

          // 5、代理方:接收方,遵守代理协议
          class Page7: UIViewController, PageDelegate1 {
      
          // 6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
          let pvc8 = Page8()
      
          pvc8.delegate = self
      
          // 7、代理方:接收方,实现代理协议中的方法,接收传递值
          func setLabelWithText(protocolText: String?) {
      
              receiveLabel.text = protocolText
          }

2.2 代理反向传值封装

  • 代理 - 反向传值,代理封装

    • 1、创建代理协议,并在协议中创建协议方法

    • 2、委托方:发送方,包含协议头文件
    • 3、委托方:发送方,创建代理人属性变量
    • 4、委托方:发送方,声明重构的 init 初始化方法
    • 5、委托方:发送方,重构 init 初始化方法
    • 6、委托方:发送方,调用协议方法,发送传递值

    • 7、代理方:接收方,遵守代理协议
    • 8、代理方:接收方,用重构初始化方法实例化委托方对象,并设置其代理人为 self
    • 9、代理方:接收方,实现代理协议中的方法,接收传递值

  • Objective-C

    • PageDelegate2.h

          #import <Foundation/Foundation.h>
      
          @protocol PageDelegate2 <NSObject>
      
          // 1、创建代理协议,并在协议中创建协议方法
          - (void)setLabelWithText:(NSString *)protocolText;
      
          @end
    • Page10.h

          // 2、委托方:发送方,包含协议头文件
          #import "PageDelegate2.h"
      
          // 3、委托方:发送方,创建代理人属性变量
          @property(nonatomic, weak)id<PageDelegate2> delegate;
      
          // 4、委托方:发送方,声明重构的 init 初始化方法
          - (instancetype)initWithTarget:(id<PageDelegate2>) delegate;
    • Page10.m

          // 重构的 init 初始化方法
          // 5、委托方:发送方,重构 init 初始化方法
          - (instancetype)initWithTarget:(id<PageDelegate2>)delegate {
      
              if (self = [super init]) {
      
                  self.delegate = delegate;
              }
              return self;
          }
      
          if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) {
      
              // 6、委托方:发送方,调用协议方法,发送传递值
              [self.delegate setLabelWithText:sendTextFiled.text];
          }
    • Page9.m

          // 7、代理方:接收方,遵守代理协议
          @interface Page9 () <PageDelegate2>
      
          // 8、代理方:接收方,用重构初始化方法实例化委托方对象,并设置其代理人为 self
          Page10 *pvc10 = [[Page10 alloc] initWithTarget:self];
      
          // 9、代理方:接收方,实现代理协议中的方法,接收传递值
          - (void)setLabelWithText:(NSString *)protocolText {
      
              receiveLabel.text = protocolText;
          }
  • Swift

    • PageDelegate2.swift

          import Foundation
      
          protocol PageDelegate2 {
      
              // 1、创建代理协议,并在协议中创建协议方法
              func setLabelWithText(protocolText:String?)
          }
    • Page10.swift

          // 3、委托方:发送方,创建代理人属性变量
          var delegate:PageDelegate2!
      
          // 重构的 init 初始化方法
          // 5、委托方:发送方,重构 init 初始化方法
          init(target delegate:PageDelegate2) {
      
              // 在 ViewController 中不能使用 super.init()
              super.init(nibName: nil, bundle: nil)
      
              self.delegate = delegate
          }
      
          if self.delegate != nil {
      
              // 6、委托方:发送方,调用协议方法,发送传递值
              self.delegate.setLabelWithText(sendTextFiled.text)
          }
    • Page9.swift

          // 7、代理方:接收方,遵守代理协议
          class Page9: UIViewController, PageDelegate2 {
      
          // 8、代理方:接收方,实例化发送方对象,并设置其代理人为 self
          let pvc10 = Page10(target: self)
      
          // 9、代理方:接收方,实现代理协议中的方法,接收传递值
          func setLabelWithText(protocolText: String?) {
      
              receiveLabel.text = protocolText
          }
目录
相关文章
|
iOS开发
iOS代理 通知 block传值的规范写法
iOS代理 通知 block传值的规范写法
116 0
|
存储 API iOS开发
苹果手机iOS如何使用http代理
我们使用苹果手机访问网络时,有时候需要配置代理服务器。下面就来介绍一下。
苹果手机iOS如何使用http代理
|
C语言 iOS开发
IOS中block和代理
从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockName的block
Ios8之后, 定位的delegate不能触发的问题
Ios8之后, 定位的delegate不能触发的问题
88 0
|
iOS开发 索引
iOS UITableView代理方法详解
iOS UITableView代理方法详解
159 0
|
缓存 编解码 API
淘票票 iOS 客户端:视频本地代理与缓存方案
提高客户端视频起播速度一直是比较关键的优化点。如何提高起播速度?除了通过优化网络、提高服务器带宽、优化视频文件码率帧率等常规方案外,还可以从哪些方面进行优化呢?一起来看看吧!
淘票票 iOS 客户端:视频本地代理与缓存方案
|
iOS开发 开发者 编译器
iOS开发--通知,代理,KVO的区别,以及通知的多线程问题
1. delegate 当我们第一次编写ios应用时,我们注意到不断的在使用“delegate”,并且贯穿于整个SDK。delegation模式不是IOS特有的模式,而是依赖与你过去拥有的编程背景。针对它的优势以及为什么经常使用到,这种模式可能不是很明显的。
|
存储 iOS开发 开发工具
【iOS 开发】UIApplicationDelegate 中两个值得注意的地方
01 - app 的第一个执行代码的机会是什么 新建工程的时候,Xcode 默认创建的 AppDelegate 文件里面会有 UIApplicationDelegate 的 6 个代理方法,其中第一个是 application:didFinishLau...
914 0