博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用KVC实现无需协议的委托模式
阅读量:6216 次
发布时间:2019-06-21

本文共 1712 字,大约阅读时间需要 5 分钟。

在《精通iOS开发》一书中看到的技巧。假设BIDTaskListController是一个列表,点击列表上的一项将会导航到BIDTaskDetailController,在BIDTaskDetailController当中修改值并保存后,将把修改后的值回传给BIDTaskListController并更新局部视图。

 

在BIDTaskListController类中有如下方法:

1 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 2     UIViewController *destination = segue.destinationViewController; 3     if ([destination respondsToSelector:@selector(setDelegate:)]) { 4         [destination setValue:self forKey:@"delegate"]; 5     } 6     if ([destination respondsToSelector:@selector(setSelection:)]) { 7         // prepare selection info 8         NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 9         id object = self.tasks[indexPath.row];10         NSDictionary *selection = @{
@"indexPath" : indexPath,11 @"object" : object};12 [destination setValue:selection forKey:@"selection"];13 }14 }

红字部分通过segue拿到了目标控制器,并且通过KVC的方式将自身设置为了目标的代理。

 

在BIDTaskDetailController当中有如下回调:

1 [self.delegate setValue:editedSelection forKey:@"editedSelection"];

这句代码调用了BIDTaskListController当中editedSelection属性的setter方法,实现了对数据源的修改,并且在setter方法中刷新了视图:

1 - (void)setEditedSelection:(NSDictionary *)dict { 2     if (![dict isEqual:self.editedSelection]) { 3         _editedSelection = dict; 4         NSIndexPath *indexPath = dict[@"indexPath"]; 5         id newValue = dict[@"object"]; 6         [self.tasks replaceObjectAtIndex:indexPath.row withObject:newValue]; 7         [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 8                               withRowAnimation:UITableViewRowAnimationAutomatic]; 9     }10 }

如此,借助KVC以及回调数据源的setter方法可以彻底解除两个控制器之间的耦合,同时避免了定义协议,使代码更灵活。

转载于:https://www.cnblogs.com/Steak/p/3577145.html

你可能感兴趣的文章
redis单机安装
查看>>
普通java项目打jar包运行
查看>>
ABBYY FineReader 12中怎样自定义主窗口
查看>>
使用 highlight.js 高亮网站代码
查看>>
笨兔兔的故事——带你了解Ubuntu,了解Linux 第二章 醒来
查看>>
spark sql简单示例
查看>>
CSRF防范简介
查看>>
关于HTTP keep-alive的实验
查看>>
前嗅ForeSpider脚本教程:字段取值脚本
查看>>
分析NTFS文件系统内部结构
查看>>
android程序加载so动态库和jar包
查看>>
nagios插件性能数据显示格式
查看>>
创建临时表的语法
查看>>
数学相关
查看>>
深入理解Magento – 第三章 – 布局,块和模板
查看>>
外来键简介和sql语句
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
LNMP--Nginx不记录指定文件日志
查看>>
在线聊天系统
查看>>
SQL Server 命名实例改为默认实例
查看>>