IOS之Objective-C学习 代理设计模式
鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式。
代理,又称委托,delegation。
代理模式可以让一个单继承的类实现父类以外其他类的方法。代理也可以用于传值。
我们先来说说原理,最后再看看是如何传值的。


如图选取Objective-C File并选择Protocol创建文件后在该协议文件中写入方法。
myProtocol.h
@protocol myDelegation <NSObject>
-(void)method1;
-(void)method2;
@end
创建另一个类用于实现myProtocol.h中的方法
myDelegate.h
#import <Foundation/Foundation.h>
#import "myProtocol.h"
@interface myDelegate : NSObject<myProtocol>
{
id<myProtocol>obj;
}
-(void)method3;
-(instancetype)initWithObj:(id<myProtocol>)obj;
@end
myDelegate.m
#import "myDelegate.h"
@implementation myDelegate
-(instancetype)initWithObj:(id<myProtocol>)o{
self=[super init];
if(self){
obj=o;
}
return self;
}
-(void)method1{
[obj method1];
}
-(void)method2{
[obj method2];
}
-(void)method3{
NSLog(@"自身的方法。。。");
}
@end
创建一个实现方法的类
helper.h
#import <Foundation/Foundation.h>
#import "myProtocol.h"
@interface helper : NSObject<myProtocol>
@end
helper.m
#import "helper.h"
@implementation helper
-(void)method1{
NSLog(@"helper做method1。。。");
}
-(void)method2{
NSLog(@"helper做method2。。。");
}
@end
代理实现:
#import <Foundation/Foundation.h>
#import "myProtocol.h"
#import "myDelegate.h"
#import "helper.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
helper *h=[[helper alloc]init];
myDelegate *delegate=[[myDelegate alloc]initWithObj:h];
[delegate method1];
[delegate method2];
[delegate method3];
}
return 0;
}
运行结果:
helper做method1。。。
helper做method2。。。
自身的方法。。。
以上就是代理的原理,接下来我们看看代理是如何传值的。
代理传值有通过类与类之间,还有通过控制器(Controller)与控制器(Controller)之间的传值。我以控制器之间传值为例展示一下代理传值。
首先创建一个Protocol文件
sendDataDelegate.h
#import <Foundation/Foundation.h>
@protocol sendDataDelegate <NSObject>
-(void)sendData:(NSString*)str;
@end
然后创建第二个视图控制器类,并在main.storyborad中拖拽另一个视图控制器并将类与视图匹配。添加button到系统给的视图控制器并以modal的方式连接到第二个视图控制器,如图:

ViewController.h
#import <UIKit/UIKit.h>
#import "sendDataDelegate.h"
@interface ViewController : UIViewController<sendDataDelegate>
@end
ViewController.m
#import "ViewController.h"
#import "secondViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *myTextField;//从故事版中拖拽进来
@property(nonatomic,strong)NSString *temp;
@end
@implementation ViewController
//记得给故事版中go button拖拽的segue的identifier属性命名gotosecond
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"gotosecond"]) {
secondViewController *svc=(secondViewController*)segue.destinationViewController;
svc.delegate=self;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)sendData:(NSString *)str{
self.temp =str;
self.myTextField.text=self.temp;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
secondViewController.h
#import <UIKit/UIKit.h>
#import "sendDataDelegate.h"
@interface secondViewController : UIViewController
@property(nonatomic,weak)id<sendDataDelegate>delegate;
@end
secondViewController.m
#import "secondViewController.h"
#import "ViewController.h"
@interface secondViewController ()
@property (weak, nonatomic) IBOutlet UITextField *myTextField;
@end
@implementation secondViewController
- (IBAction)back:(id)sender {
[self.delegate sendData:self.myTextField.text];
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
效果图演示

当一个视图控制器需要另一个视图控制器更新UI或者做其他事情的时候,我们可以通过代理传值的方法来实现。
IOS之Objective-C学习 代理设计模式的更多相关文章
- 你真的了解iOS代理设计模式吗?
在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...
- 【转】你真的了解iOS代理设计模式吗?
转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- ios代理设计模式
代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事情,A成为B的代理 代理设计模式的总结: 如果你想监听别人的一些行为,那么 ...
- OC学习——OC中的@protocol(@required、@optional)、代理设计模式
一.什么是协议? 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议. 4.协 ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- Objective-C之代理设计模式小实例
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- ios和android一并学习的体会
如果说为什么要同时学习这两种不同的移动平台,其实有一定的“闲”的因素在里面. 相对于ios,android我是早半年接触的.最开始学习的时候也就是j2ee学习的延续,通过看视频连带看书学了大概一个月的 ...
- [学习笔记]设计模式之Builder
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...
随机推荐
- ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
- MySQL基础之视图
关于视图 视图是虚表,其中并不存在数据,只是多个表的组成 使用视图的优势 视图可以代替复杂的查询SQL语句,可以事先将不同表的多个数据组织起来 提高权限控制管理,能够将权限限制为行级管理,更具有安全性 ...
- SQL Server 存储中间结果集
在SQL Server中执行查询时,有一些操作会产生中间结果集,例如:排序操作,Hash Join和Hash Aggregate操作产生的Hash Table,游标等,SQL Server查询优化器使 ...
- PHP 高级编程(5/5) - SPL 数组重载
ArrayAccess接口 ArrayAccess接口是对象的行为看起来像个数组,定义了四个方法.接口概要如下: ArrayAccess { /* Methods */ abstract public ...
- VS2010编写WebService与在IIS的发布<之简单讲解>
工具VS2010,window环境win7 一:Webservice的创建与方法查看调用 1.新建空web应用程序项目 2.新建web服务 3.自动生成 4.直接跑起来,可以看到有2个方法 5.点击H ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码
系列目录 我们上一节建了数据库的表,但我发现很多东西还未完善起来,比如验证码,我们先做好验证码吧,验证码我们再熟悉不过了,为了防止恶意的登录,我们必须在登录页面加入验证码,下面我将分享一个验证码,这个 ...
- Vertica 安装,建库,新建测试用户并授予权限,建表,入库
测试环境:RHEL 6.4 + Vertica 6.1.3-7 需求:搭建Vertica数据库3节点的测试环境,建立测试用户,建表,测试数据入库. 1.各节点关闭防火墙和SELinux,配置主机名,I ...
- “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...
- 1000行代码实现MVVM (类似Angular1.x.x , Vue)
最近花了近半个多月的时间, 自己纯手工写了一个很小型的类angularjs/vue的mvvm 库. 目前已经用于公司一个项目. 项目托管在github https://github.com/leonw ...