iOS-Delegate模式
代理模式 顾名思义就是委托别人去做事情。
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模式相关推荐
- iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER CDD)
最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多的人参考.原文 ...
- iOS 暗黑模式适配(项目实战篇)
通过上面两篇文章,我们知道了暗黑模式怎么去适配,那么如何结合到真实的项目场景中去呢? 适配目标 在项目适配之前,先来梳理一下需要适配的东西,以及可能预见的问题. 一.下图是我们单个App的控件适配目标 ...
- iOS架构模式(MVC/MVCS/MVP/MVVM/VIPER)
iOS架构模式 谈起iOS架构,也许你直接想到的就是MVC,MVVM等等.其实这是不准确的,iOS架构包含的内容有很多,而上面的这些只是iOS架构中的架构模式. 那么你在进行架构设计的时候到底是选择M ...
- ios 静音模式_静音设计模式
ios 静音模式 您最近是否遵循Mute-Design-Pattern™编写了大量代码? 例如 try {complex();logic();here(); } catch (Exception ig ...
- 微软开源 Outlook for iOS 暗黑模式解决方案:支持 iOS 11 及更高版本
微软于 2019 年 8 月推出了面向 Outlook 的暗黑模式,并于去年初开始对该应用程序展开更广泛的重新设计.在新增的外观和功能中,就包括大家期待已久的暗黑模式.现在,软件巨头已决定将其开源,并 ...
- iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)
写在前面的话 最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多 ...
- 百度APP iOS暗黑模式适配的完美解决方案
原创:liushaohua 百度APP技术团队 一 背景 在2019WWDC的开场演讲中,苹果公布了即将推出的iOS13 DarkMode的新特性.此新特性不仅可以在夜晚保护视力,而且对于使用OLED ...
- ios 暗黑模式 Dark Mode
*ios 暗黑模式 Dark Mode 一.UITraitCollection 为表征 size class 而生,用来区分设备.你可以在它身上获取到足以区分所有设备的特征 API: (1)判断当前设 ...
- h5页面支持ios暗黑模式 (css、js)
css更改暗黑模式: https://python.freelycode.com/contribution/detail/1593 这篇里里面讲的很详细 具体操作就是,在你的公共css文件顶部写上这么 ...
- iOS 盲人模式开发
VoiceOver的使用 1.如何打开VoiceOver? iPhone设备 :通过 设置-通用-辅助功能-VoiceOver 打开. 2.如何关闭VoiceOver? iPhone设备 :三指同时触 ...
最新文章
- 【用深度学习搜索相似服饰】《Using Deep Learning to Find Similar Dresses》by Luis Mey
- 文本编辑器ConsoleEditor_v1.2
- jQuery父级以及同级元素查找
- 手写ORM入门篇(一)
- 这就是搜索引擎--读书笔记五--索引的建立与更新
- 一张以你为中心的地图
- 华为交换机S5700系列配置通过STelnet登录设备示例
- 高职计算机基础知识试题及答案,职业技术学院招生考试计算机基础知识试题-20210713174723.doc-原创力文档...
- 云计算和虚拟化 - 虚拟化的介绍
- MD5算法是否可逆?
- 万字长文带你彻底搞懂什么是 DevOps
- gwt java_GWT中的Java 8支持
- 人口流向数据_中国人口流动数据挖掘分析云平台
- C++11 emplace_back
- unity 实现手机振动_Unity3d之音效播放和调用手机震动
- FileZilla的下载与安装
- IOS 使用TestFlight 详解
- python3 绘制盖尔圆
- 教你如何一键重装Windows7系统
- 电路中滤波电容和退耦电容_去耦电路中,耦合电容容量越大越好吗?