版权声明:原创作品,谢绝转载!否则将追究法律责任。

代理:

另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制。例如当你用一个tableView,你必须实现他里面的一个tableView:numberOfRowsInSection:.方法。你不希望tableView知道他有多少行在每个section,因此这个计算每个区有几行的任务交给了UITableView的代理。他允许tableView类是独立的数据显示。

当你创建一个UITableView的时候下面发生的:

这个tableView的对象的工作是用来展示tableView的,然而最终他将需要一些信息他没有的。然后转向他的代理和要求额外的信息通过发送一条信息。在Objective-c实现代理的设计模式。一个类可以定义可选或者必须的方法通过协议。

你可能想生成一个对象的子类更容易并覆盖必须的方法,但考虑到你只能基于单个类的子类。如果你想让一个物体是两个或者两个以上的其他的对象的代表。你不能通过子类来实现这一目标。

注意:这是一个重要的设计模式。苹果在UIKit类里面用到了很多。 UITableView,UITextView, UITextField, UIWebView, UIAlert, UIActionSheet, UICollectionView, UIPickerView,UIGestureRecognizer, UIScrollView.这里面都有

怎么使用代理的设计模式呢?

在Viewcontroller的实现文件里面导入头文件:

#import "LibraryAPI.h"#import "Album+TableRepresentation.h"

现在添加一个延展来添加私有变量:

@interface ViewController () {

UITableView *dataTable;

NSArray *allAlbums;

NSDictionary *currentAlbumData;

int currentAlbumIndex;

}

@end

然后在延展的括号后面添加协议名字:

@interface ViewController () <UITableViewDataSource, UITableViewDelegate>

这使你的代理符合一个协议,使你能使用协议里面的方法。在这里你表示你的ViewController符合UITableViewDataSource 和UITableViewDelegate 协议。这种方法tableView可以绝对肯定的由其委托实现他协议必须实现的方法。

接下来在viewDidLoad写以下代码:

- (void)viewDidLoad

{

[super viewDidLoad];

// 1

self.view.backgroundColor = [UIColor colorWithRed:0.76f green:0.81f blue:0.87f alpha:1];

currentAlbumIndex = 0;

//2

allAlbums = [[LibraryAPI sharedInstance] getAlbums];

// 3

// the uitableview that presents the album data

dataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 120, self.view.frame.size.width, self.view.frame.size.height-120) style:UITableViewStyleGrouped];

dataTable.delegate = self;

dataTable.dataSource = self;

dataTable.backgroundView = nil;

[self.view addSubview:dataTable];

}

对上面代码的解释:

1:改变背景颜色

2:得到专辑的列表用API而不是直接用PersistencyManager

3:这里创建tableView。你声明这个ViewController是是tableView的代理或者数据源,因此tableView所有的信息都将要被这个Viewcontroller提供。

现在添加下面方法到Viewcontroller的实现文件里面

- (void)showDataForAlbumAtIndex:(int)albumIndex

{

// defensive code: make sure the requested index is lower than the amount of albums

if (albumIndex < allAlbums.count)

{

// fetch the album

Album *album = allAlbums[albumIndex];

// save the albums data to present it later in the tableview

currentAlbumData = [album tr_tableRepresentation];

}

else

{

currentAlbumData = nil;

}

// we have the data we need, let's refresh our tableview

[dataTable reloadData];

}

showDataForAlbumAtIndex从专辑的数组得到想要的专辑数据。当你想显示最新的数据的时候你需要调用reloadData。他是tableView想他的代理询问例如有多少section应该出现在tableVeiw上,在每个section里面有很多行,并且每行应该怎么显示。

在ViewDidLoad最后一行添加[self showDataForAlbumAtIndex:currentAlbumIndex]

;

在应用加载当前专辑。并且currentAlbumIndex 先前设置0,他在集合里面展示第一个专辑。

编译运行项目你得到一个崩溃下面有一个异常在debug窗口:

你把Viewcontroller设置为tableView的数据源或者代理。你必须实现他里面所有的必须实现的方法包括tableView:numberOfRowsInSection:但是你没有这样做。

在实现文件里面添加以下代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return [currentAlbumData[@"titles"] count];

}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

if (!cell)

{

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];

}

cell.textLabel.text = currentAlbumData[@"titles"][indexPath.row];

cell.detailTextLabel.text = currentAlbumData[@"values"][indexPath.row];

return cell;

}

tableView:numberOfRowsInSection: 返回在tableView里面显示多少行。和在数据结构里面标题的个数匹配、

tableView:cellForRowAtIndexPath:创建返回一个cell带有标题和值;

编译运行项目你的应用应该这样展示:

到目前为止看起来不错。但是如果你还记得完成应用后第一次启动的画面。在屏幕的顶部有一个水平照片的滑动视图。而不是专用的水平滑动的视图为什么不使他重用呢?

为了让他重用,所有内容的显示等都交给了另一个对象:一个代理。这个水平滑动视图应该声明协议方法让他的代理来实现。类似于tableView的代理方法是怎么工作的。我们在下一个设计模式里面讨论如何实现。

一个适配器设计模式允许你的类和不兼容的接口一起工作。它封装在一个对象,并公开了一个标准的接口和该对象进行交互。如果你熟悉适配器设计模式,那么你会发现苹果实现了它以稍微不同的方式--苹果使用协议来做这项工作。你可能熟悉的协议像UITableViewDelegate,UScrollViewDelegate,NSCoding,和NSCopying。例如用这个NSCopying协议任何类可以提供标准的copy方法。

IOS设计模式第五篇之装饰设计模式的代理设计模式的更多相关文章

  1. IOS设计模式第四篇之装饰设计模式的类别设计模式

    装饰设计模式 装饰设计模式动态的添加行为和责任向一个对象而不修改他的任何代码.他是你子类化修改类的行为用通过另一个对象的包装的代替方法. 在Objective-c里面有很多这种设计模式的实现,像cat ...

  2. Qt MVC设计模式(五篇)

    http://blog.csdn.net/qq_19672579/article/details/46952675http://blog.csdn.net/qq_19672579/article/de ...

  3. Python全栈开发记录_第五篇(装饰器)

    单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的(代码大约150行). 了解装饰器之前要知道三个知识点 作用域,上一篇讲到过顺序是L->E->G->B 高阶函数: 满 ...

  4. IOS UI 第五篇:基本UI

    添加个导航栏:         Xib1 *xib1 = [[Xib1 alloc] initWithNibName:@"Xib1" bundle:nil];    UINavig ...

  5. python之路第五篇之装饰器:(进阶篇)

    装饰器: 学前必备知识: def f1(): print "f1" f1() #表示函数执行 f1 #表示函数,指向内存地址 f1 = lambda x: x + 1 f1() # ...

  6. JAVA设计模式---总述篇

    一.设计模式(Design Pattern): 1.设计模式的概念 是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及 ...

  7. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Metho ...

  8. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  9. 【转】你真的了解iOS代理设计模式吗?

    转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...

随机推荐

  1. (原)在firefly_rk3288开发板上解决openGL在设置32位色深以后出现花屏的问题

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/5567141.html 在做openGL测试的过程中,根据论坛上的帖子,在使用/bin/fbset -a -no ...

  2. python subprocess 模块

    subprocess 模块中有一个功能Popen , 可以在代码中调用系统的命令 其功能比os.system 更加强大 代码示例: command = 'python -u %s/generalMak ...

  3. Linux free命令使用及解析

    1. 命令格式 free [参数] 2. 命令功能 free 命令显示系统使用和空闲的内存情况,包括物理内存.交互区内存(swap)和内核缓冲区内存.共享内存将被忽略 3. 命令参数 -b 以Byte ...

  4. 正则表达式awk

    以冒号: 为分隔符打印出来:打印第一段$1:  -F 分隔符 [root@localhost awk]# awk -F ':' '{print $1}' test.txt root bin daemo ...

  5. Java华氏转摄氏

    package test; import java.util.Scanner; public class temperature { public static void main(String[] ...

  6. VS2010 正则批量替换头文件路径

        最近在项目实践中,需要统一对工程头文件进行重构,具体要求是,将之前 #include "../../abc/def.h" 类似的头文件引用路径 替换为#include &q ...

  7. js准确获取当前页面url网址信息

    这篇文章主要为大家介绍了js准确获取当前页面url网址信息的多种方法,包括正则法.split拆分法等,需要的朋友可以参考下   在WEB开发中,时常会用到javascript来获取当前页面的url网址 ...

  8. struts2危险漏洞解决方法

    原创,bgy编写.2013-07-24 前文: 随着苹果开发者网站的沦陷,已经曝光一周的Apache Struts2漏洞再次成为热门话题,今天有消息称由于该漏洞被利用,淘宝的数据库已经被盗,尽管淘宝官 ...

  9. 使用 Python 解数学方程

    SymPy是符号数学的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁.易于理解和扩展 服务器Ubuntu 1.安装Python 2.安装SymPy库 sudo pip in ...

  10. [SLAM] 01. "Simultaneous Localization and Mapping"

    本篇带你认识SLAM,形成客观的认识和体系 一.通过行业招聘初步了解SLAM 发信人: leecty (Terry), 信区: ParttimeJobPost标 题: 创业公司招SLAM 算法工程师发 ...