代理模式 顾名思义就是委托别人去做事情。

IOS中经常会遇到的两种情况:在cocoa框架中的Delegate模式与自定义的委托模式。下面分别举例说明一下:

一、cocoa框架中的delegate模式

在cocoa框架中的Delegate模式中,委托人往往是框架中的对象(视图中的控件、表视图神马的),代理人往往是视图控制器对象。

在我们这个例子中UITableView是委托人,代理人首先得满足一个条件:就是在.h文件中申明它拥有代理资格:

@interface WhateverViewController < UITableViewDelegate >
@end

红色的表示这个视图控制器拥有UITableView的代理资格。

其次,在.m文件中定义委托人可以让代理人去代替做的事情:

//视图控制器来代办应该有多少个节
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return [NSArray count];
}
//视图控制器来代办某个节应该有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return [[NSArray objectAtIndex:section]count];
}
// 视图控制器来代办负责每个栏格的外观
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];}cell.textField.text = [NSArray objectAtIndex:indexPath.row]; return cell;
}
//负责当栏格被点击后需要触发的事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {AnotherViewController *anotherViewController = [[AnotherViewController alloc]initWithNibName:@"AnotherView" bundle:nil];[self.navigationController pushViewController:anotherViewController];[anotherViewController release];
}
// 这个是可选的,视图控制器勤快我就帮你代办,不勤快我就可以不帮你办这事儿,(提供哪些个行可以被编辑)
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {return YES;
}
// 对特定编辑风格进行操作
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{if (editingStyle == UITableViewCellEditingStyleDelete) {[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];}else if (editingStyle == UITableViewCellEditingStyleInsert) {}
}
// 可选,对那些被移动栏格作特定操作
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
// 对那些可以移动的行返回YES
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {// 如果不想让栏格移动,就返回NOreturn YES;
}

好了,当这个委托人需要办这些事时,代理人自己就站出来帮忙办了。这就是ios中的Delegate模式。

二、自定义的delegate模式

@interface A:UIView
id transparendValueDelegate;
@property(nomatic, retain) id transparendValueDelegate;@end@implementation A
@synthesize transparendValueDelegate-(void)Call
{
NSString* value = @"你好";
[transparendValueDelegate transparendValue: value];
}@end

@interface B:UIView
NSString* value;
@end

@implementation B
-(void)transparendValue:(NSString*)fromValue
{
value = fromValue;
NSLog(@"%@ ,我是B",value);
}
@end

使用时:

A* a = [[A alloc] init];
B* b = [[B alloc] init];
a. transparendValueDelegate = b;//设置A代理委托对象为B
[a Call];

这样就会输出:

你好,我是B

委托模式关键就在于一个“被”字。这个B是很被动的,随时就会被你A Call一下。

三、为什么会有delegate模式

换句话说,它可以用来解决神马问题?

当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确谁来实现这些功能的时候,委托模式就可以派上用场。

例如你可以再写个C类,实现-(void)transparendValue:(NSString*)fromValue {NSLog(@"%@ ,我是C",value); }也是完全可以的。换谁来,只要它实现了这个方法,我就可以委托它来做这个事。

说到底一切都是为了使类之间的耦合性更松散。好的代码应该对扩展开放,对修改关闭

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/5031661.html

iOS-Delegate模式相关推荐

  1. iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER CDD)

    最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多的人参考.原文 ...

  2. iOS 暗黑模式适配(项目实战篇)

    通过上面两篇文章,我们知道了暗黑模式怎么去适配,那么如何结合到真实的项目场景中去呢? 适配目标 在项目适配之前,先来梳理一下需要适配的东西,以及可能预见的问题. 一.下图是我们单个App的控件适配目标 ...

  3. iOS架构模式(MVC/MVCS/MVP/MVVM/VIPER)

    iOS架构模式 谈起iOS架构,也许你直接想到的就是MVC,MVVM等等.其实这是不准确的,iOS架构包含的内容有很多,而上面的这些只是iOS架构中的架构模式. 那么你在进行架构设计的时候到底是选择M ...

  4. ios 静音模式_静音设计模式

    ios 静音模式 您最近是否遵循Mute-Design-Pattern™编写了大量代码? 例如 try {complex();logic();here(); } catch (Exception ig ...

  5. 微软开源 Outlook for iOS 暗黑模式解决方案:支持 iOS 11 及更高版本

    微软于 2019 年 8 月推出了面向 Outlook 的暗黑模式,并于去年初开始对该应用程序展开更广泛的重新设计.在新增的外观和功能中,就包括大家期待已久的暗黑模式.现在,软件巨头已决定将其开源,并 ...

  6. iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)

    写在前面的话 最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多 ...

  7. 百度APP iOS暗黑模式适配的完美解决方案

    原创:liushaohua 百度APP技术团队 一 背景 在2019WWDC的开场演讲中,苹果公布了即将推出的iOS13 DarkMode的新特性.此新特性不仅可以在夜晚保护视力,而且对于使用OLED ...

  8. ios 暗黑模式 Dark Mode

    *ios 暗黑模式 Dark Mode 一.UITraitCollection 为表征 size class 而生,用来区分设备.你可以在它身上获取到足以区分所有设备的特征 API: (1)判断当前设 ...

  9. h5页面支持ios暗黑模式 (css、js)

    css更改暗黑模式: https://python.freelycode.com/contribution/detail/1593 这篇里里面讲的很详细 具体操作就是,在你的公共css文件顶部写上这么 ...

  10. iOS 盲人模式开发

    VoiceOver的使用 1.如何打开VoiceOver? iPhone设备 :通过 设置-通用-辅助功能-VoiceOver 打开. 2.如何关闭VoiceOver? iPhone设备 :三指同时触 ...

最新文章

  1. 【用深度学习搜索相似服饰】《Using Deep Learning to Find Similar Dresses》by Luis Mey
  2. 文本编辑器ConsoleEditor_v1.2
  3. jQuery父级以及同级元素查找
  4. 手写ORM入门篇(一)
  5. 这就是搜索引擎--读书笔记五--索引的建立与更新
  6. 一张以你为中心的地图
  7. 华为交换机S5700系列配置通过STelnet登录设备示例
  8. 高职计算机基础知识试题及答案,职业技术学院招生考试计算机基础知识试题-20210713174723.doc-原创力文档...
  9. 云计算和虚拟化 - 虚拟化的介绍
  10. MD5算法是否可逆?
  11. 万字长文带你彻底搞懂什么是 DevOps
  12. gwt java_GWT中的Java 8支持
  13. 人口流向数据_中国人口流动数据挖掘分析云平台
  14. C++11 emplace_back
  15. unity 实现手机振动_Unity3d之音效播放和调用手机震动
  16. FileZilla的下载与安装
  17. IOS 使用TestFlight 详解
  18. python3 绘制盖尔圆
  19. 教你如何一键重装Windows7系统
  20. 电路中滤波电容和退耦电容_去耦电路中,耦合电容容量越大越好吗?

热门文章

  1. uploadify.js
  2. RocketMQ高性能通信实现机制源码精读
  3. 一行命令轻松获取JVM默认配置
  4. clipse中使用maven插件的时候,运行run as maven build的时候报错:
  5. X86 CPU特性之(1)-umip
  6. ubuntu openssl1.0.2g交叉编译
  7. gin 源码解析 - 详解http请求在gin中的流转过程
  8. Redis:Hot Key问题
  9. Nginx应用场景之反向代理
  10. Profile配置和加载配置文件