iOS - Delegate 代理
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 - Delegate 代理的更多相关文章
- iOS delegate, 代理/委托与协议.
之前知知道iOS协议怎么写, 以为真的跟特么java接口一样, 后来发现完全不是. 首先, 说说应用场景, 就是当你要用一个程序类, 或者说逻辑类, 去控制一个storyboard里面的label, ...
- ios delegate 代理模式 观察者模式 不同视图间的通信
delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...
- iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )
iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...
- iOS 设置代理过程
iOS设置代理的过程 (以模拟 button 作用为例) 1.写协议 新建一个名为 MyButton 的文件,继承于 UIView,在该文件里 声明协议 myDelegate 2.写协议方法 为声明的 ...
- iOS设计模式 - 代理
iOS设计模式 - 代理 原理图 说明 1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用 2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助 源码 http ...
- Delegate(代理)异常:该委托必须有一个目标
转自 Delegate(代理)异常:该委托必须有一个目标 在代理调用BeginInvoke(new AsyncCallback(callBack), null);时,会抛这个异常的原因是该代理变量代理 ...
- [iOS]delegate和protocol
转自:http://haoxiang.org/2011/08/ios-delegate-and-protocol/ 今天上班和同事讨论工程怎么组织的时候涉及到这个话题.iOS开发上对delegate使 ...
- ios 页面传值4种方式(四) 之通过delegate(代理)
这是ios里最常用的设计模式了,简直贯穿了整个cocoa touch框架.废话不多说,直接上代码: 场景是: A--打开--B; B里输入数值,点击--返回--A; A里显示B输入的值; △在开始写之 ...
- IOS 自定义代理delegate方法
创建一个自定义代理 @class MJTgFooterView; /** 1.协议名称: 控件类名 + Delegate 2.代理方法普遍都是@optional 3. */ @protocol MJT ...
随机推荐
- 项目管理:CocoaPods建立私有仓库
CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...
- 通达OA 同步中控考勤机 增强版
如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性.可靠性大幅提高. 通达 ...
- Cocos2dx lua 3D实例代码
用cocoside 创建一个项目 cocos2dx lua 项目即可 ,然后替换掉gamescene 就可以,具体效果还有函数的参数,相信大家一看就明白.简单说下ide 创建的 cocos lua 项 ...
- Conditional - 编译屏蔽特性
public class Test : MonoBehaviour { void Start() { Func(); } [System.Diagnostics.Conditional("U ...
- discuz安装与学习资料
discuz的安装地址:http://www.discuz.net/thread-3457145-1-1.html 一些学习资料:http://www.discuz.net/forum-10-1.ht ...
- [美]莫提默 J. 艾德勒《如何阅读一本书》
我最近在阅读一本书,这本书的书名叫<如何阅读一本书>(商务出版社,2015),顾名思义. 作者认为,阅读是一件跟写书一样复杂的活动,而许多人并不会阅读. 看过后,你可能会有“我真没 ...
- grails的layouts模板页面使用
使用方式1: layouts文件夹下新建文件,名称和Controller名称相同,例如UserController,layouts下面创建user.gsp,此时,user站点下所有的页面都将套用 us ...
- excel小写金额转换成中文大写
假设 假设数据在A1单元格 任何一个个单元格输入公式=TEXT(INT(A1),"[dbnum2]")&"元"&IF(INT(A1*10)-IN ...
- SqlSever基础 order by之后再orderby,双重排序,对排序好的数据中再次进行排序
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- C# DataTable的详细用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...