利用KVC实现无需协议的委托模式
在《精通iOS开发》一书中看到的技巧。假设BIDTaskListController是一个列表,点击列表上的一项将会导航到BIDTaskDetailController,在BIDTaskDetailController当中修改值并保存后,将把修改后的值回传给BIDTaskListController并更新局部视图。
在BIDTaskListController类中有如下方法:
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     UIViewController *destination = segue.destinationViewController;
     if ([destination respondsToSelector:@selector(setDelegate:)]) {
         [destination setValue:self forKey:@"delegate"];
     }
     if ([destination respondsToSelector:@selector(setSelection:)]) {
         // prepare selection info
         NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
         id object = self.tasks[indexPath.row];
         NSDictionary *selection = @{@"indexPath" : indexPath,
         @"object" : object};
         [destination setValue:selection forKey:@"selection"];
     }
 }
红字部分通过segue拿到了目标控制器,并且通过KVC的方式将自身设置为了目标的代理。
在BIDTaskDetailController当中有如下回调:
[self.delegate setValue:editedSelection forKey:@"editedSelection"];
这句代码调用了BIDTaskListController当中editedSelection属性的setter方法,实现了对数据源的修改,并且在setter方法中刷新了视图:
 - (void)setEditedSelection:(NSDictionary *)dict {
     if (![dict isEqual:self.editedSelection]) {
         _editedSelection = dict;
         NSIndexPath *indexPath = dict[@"indexPath"];
         id newValue = dict[@"object"];
         [self.tasks replaceObjectAtIndex:indexPath.row withObject:newValue];
         [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                               withRowAnimation:UITableViewRowAnimationAutomatic];
     }
 }
如此,借助KVC以及回调数据源的setter方法可以彻底解除两个控制器之间的耦合,同时避免了定义协议,使代码更灵活。
利用KVC实现无需协议的委托模式的更多相关文章
- HTTP协议Keep-Alive模式详解
		
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...
 - UNIX网络编程——利用ARP和ICMP协议解释ping命令
		
一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit) ...
 - zabbix3.2利用自动发现功能对fastcgi模式的php状态进行集中监控
		
zabbix3.2利用自动发现功能对fastcgi模式的php状态进行集中监控 前端nginx虚拟主机引用后端多个php接口,为了方便监控,将后端服务器集中配置在nginx中,具体配置如下: [roo ...
 - 利用ARP和ICMP协议解释ping命令
		
一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit).如果IP ...
 - wireshark利用正则表达式过滤http协议中的jpg png zip等无用的数据包
		
主要工具:小度随身wifi热点 + wireshark抓包工具.(强烈不建议使用360的产品,非常垃圾,而且干扰代理#墙IP,搞得你不能***) 利用wireshark这个强大的协议分析利器.去分析某 ...
 - 利用Netty构建自定义协议的通信
		
在复杂的网络世界中,各种应用之间通信需要依赖各种各样的协议,比如:HTTP,Telnet,FTP,SMTP等等. 在开发过程中,有时候我们需要构建一些适应自己业务的应用层协议,Netty作为一个非常优 ...
 - LR中HTTP协议录制模式选择
		
在LR中使用HTML/HTTP协议进行脚本录制时面临正确选择HTTP-based script / URL-base script 录制模式的问题,以下是比较官方的建议:1)基于浏览器的应用程序推荐使 ...
 - (bug更正)利用KVC和associative特性在NSObject中存储键值
		
KVC 一直没仔细看过KVC的用法,想当然的认为可以在NSObject对象中存入任意键值对,结果使用时碰到问题了. 一个简单的位移动画: CAKeyframeAnimation *keyPosi=[C ...
 - oc中的委托模式
		
通过一个例子来理解委托模式 首先定义个协议 协议(protocol) :它可以声明一些必须实现的方法和选择实现的方法 (在java中称为接口) // // StudentDelegate.h // ...
 
随机推荐
- 环境配置与JBoss安装-EJB3.0入门经典学习笔记(1)
			
目录 1. JDK的安装 2. JBoss的安装 3. JBoss安装目录说明 1. JDK的安装 1) 下载JDK 下载地址:http://www.oracle.com/technetwork/ja ...
 - 关于require,require_once,include和include_once的区别
			
一.定义 require,require_once,include,include_once都属于PHP的关键字,也就是说它们实际都是PHP的语句,而不是函数,类似于print,echo一样,也是PH ...
 - 从零开始PHP学习 - 第一天
			
写这个系列文章主要是为了督促自己 每天定时 定量消化一些知识! 同时也为了让需要的人 学到点啥~! 本人技术实在不高!本文中可能会有错误!希望大家发现后能提醒一下我和大家! 偷偷说下 本教程最后的目 ...
 - project euler  48  Self powers  解决乘法爆long long
			
题目链接 求 $ 1^1+2^2+\cdots + 1000^{1000} $ %1e10 的结果. 唯一的坑点是会爆longlong, 所以用特殊的乘法. #include <iostream ...
 - RelativeLayout布局下实现控件平分空间
			
起源:使用惯LinearLayout的朋友都知道,若想实现对屏幕的等分,只需要设置Layout_weight的值即可. 可是在RelativeLayout布局下实现等分却不是那么容易. 下面就简单介绍 ...
 - Trafic
			
Dialogue 1 You took the wrong bus 你做错车了 A:Hi, I want to see the Terra Cotta Warriors in Xi'an. Coul ...
 - ORACLE 两个表或两个结果集的数据对比常用的函数
			
假设有两个表A,B,都只有一个字段PHONE 1,MINUS SELECT PHONE FROM A MINUS SELECT PHONE FROM B; 相当于用结果集A减去结果B得出的结果 ...
 - sshuttle基于VPN的透明代理,安全连接
			
sshuttle基于VPN的透明代理, 通过 ssh 创建一条从你电脑连接到任何远程服务器的 VPN 连 sudo sshuttle -r username@sshserver 0.0.0.0/0 - ...
 - 自定义UITextField(UITextField重写)
			
// CustomField.h #import <UIKit/UIKit.h> @interface CustomField : UITextField @end // CustomFi ...
 - 网页平面设计 CSS
			
1.在html中引入css的方法 1.行内式 行内式即在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用. 例如:<h1 style="属性名 ...