代理设计模式的作用:
     1.A对象监听B对象的一些行为,A成为B的代理
     2.B对象想告诉A对象一些事情,A成为B的代理
   代理设计模式的总结:
     如果你想监听别人的一些行为,那么你就要成为别人的代理
     如果你想告诉别人一些事情,那么就让别人成为你的代理
     
    代理设计模式的开发步骤
     1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)
     2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
     3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
     4.设置代理:xxx.delegate = yyy;
     5.yyy对象遵守协议,实现代理方法

 #import <UIKit/UIKit.h>

 @class XMGLoadMoreFooter;

 @protocol XMGLoadMoreFooterDelegate <NSObject>
@optional//不写@optional默认为必须实现的代理方法
//代理方法一般以类名开头,传入被监听的控件对象
- (void)loadMoreFooterDidClickLoadMoreButton:(XMGLoadMoreFooter *)footer;
@end @interface XMGLoadMoreFooter : UIView
+ (instancetype)footer;
//代理属性用weak修饰,id类型代表任何类都可以作为代理,在<>中指明要实现的协议名称
@property (nonatomic, weak) id<XMGLoadMoreFooterDelegate> delegate; /**
* 结束加载状态
*/
- (void)endLoading;
@end

h文件

 //
// XMGLoadMoreFooter.m
// 06-自定义等高cell01-storyboard
//
// Created by xiaomage on 15/6/6.
// Copyright (c) 2015年 小码哥. All rights reserved.
// #import "XMGLoadMoreFooter.h"
#import "XMGDealsViewController.h" @interface XMGLoadMoreFooter()
@property (weak, nonatomic) IBOutlet UIButton *loadMoreButton;
@property (weak, nonatomic) IBOutlet UIView *loadingMoreView;
@end @implementation XMGLoadMoreFooter + (instancetype)footer
{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
} /**
* 点击了加载更多
*/
- (IBAction)loadMore {
self.loadMoreButton.hidden = YES;
self.loadingMoreView.hidden = NO; // 告诉代理,非必须实现的代理方法先判断下是否被代理类实现,
//在内部发生某些行为时调用代理对应的代理方法,通知代理发生了什么事
if ([self.delegate respondsToSelector:@selector(loadMoreFooterDidClickLoadMoreButton:)]) {
[self.delegate loadMoreFooterDidClickLoadMoreButton:self];
}
} /**
* 结束加载状态
*/
- (void)endLoading
{
self.loadMoreButton.hidden = NO;
self.loadingMoreView.hidden = YES;
} @end

m文件

 //
// XMGDealsViewController.m
// 06-自定义等高cell01-storyboard
//
// Created by xiaomage on 15/6/2.
// Copyright (c) 2015年 小码哥. All rights reserved.
// #import "XMGDealsViewController.h"
#import "XMGDeal.h"
#import "XMGDealCell.h"
#import "XMGPageView.h"
#import "XMGLoadMoreFooter.h" @interface XMGDealsViewController () <XMGLoadMoreFooterDelegate>
/** 所有的团购数据 */
@property (nonatomic, strong) NSMutableArray *deals;
@end @implementation XMGDealsViewController /**
* 代理设计模式的作用:
* 1.A对象监听B对象的一些行为,A成为B的代理
* 2.B对象想告诉A对象一些事情,A成为B的代理
*
* 代理设计模式的总结:
* 如果你想监听别人的一些行为,那么你就要成为别人的代理
* 如果你想告诉别人一些事情,那么就让别人成为你的代理
*
* 代理设计模式的开发步骤
* 1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)
* 2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
* 3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
* 4.设置代理:xxx.delegate = yyy;
* 5.yyy对象遵守协议,实现代理方法
*/ - (NSMutableArray *)deals
{
if (_deals == nil) {
// 加载plist中的字典数组
NSString *path = [[NSBundle mainBundle] pathForResource:@"deals.plist" ofType:nil];
NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; // 字典数组 -> 模型数组
NSMutableArray *dealArray = [NSMutableArray array];
for (NSDictionary *dict in dictArray) {
XMGDeal *deal = [XMGDeal dealWithDict:dict];
[dealArray addObject:deal];
} _deals = dealArray;
}
return _deals;
} - (void)viewDidLoad {
[super viewDidLoad]; // 设计模式:代理设计模式 XMGLoadMoreFooter *footer = [XMGLoadMoreFooter footer];
footer.delegate = self;
self.tableView.tableFooterView = footer; XMGPageView *pageView = [XMGPageView pageView];
pageView.imageNames = @[@"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2"];
self.tableView.tableHeaderView = pageView;
} #pragma mark - <XMGLoadMoreFooterDelegate>
- (void)loadMoreFooterDidClickLoadMoreButton:(XMGLoadMoreFooter *)footer
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 加载数据
XMGDeal *deal = [[XMGDeal alloc] init];
deal.icon = @"2c97690e72365e38e3e2a95b934b8dd2";
deal.title = @"xxxx";
deal.price = @"";
deal.buyCount = @"";
[self.deals addObject:deal]; // 刷新表格
[self.tableView reloadData]; // 结束footer的加载状态
XMGLoadMoreFooter *footer = (XMGLoadMoreFooter *)self.tableView.tableFooterView;
[footer endLoading];
});
} #pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.deals.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// 创建cell
XMGDealCell *cell = [XMGDealCell cellWithTableView:tableView]; // 取出模型数据
cell.deal = self.deals[indexPath.row]; return cell;
} @end

实现代理

ios代理设计模式的更多相关文章

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

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

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

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

  3. iOS 代理设计模式

    在项目中经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式传递一些参数. 在项目中,刚开始我是用一些代理来传递参数的,但是慢慢觉得代理的代码比较block多,所以就更多的使用 ...

  4. IOS之Objective-C学习 代理设计模式

    鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...

  5. iOS常用设计模式和机制之代理

    Delegate : 1 代理设计模式的使用我们首先需要明白三个要素 *委托方:委托别人去执行某些操作的人(对象) *代理方:被委托区执行某些操作的人(对象) *协议:(protocol)委托方需要代 ...

  6. iOS 代理反向传值

    在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用. 假如我们有一个需求如下:界面A上面有一个button.一个label.从界面A跳转到界面B,在界面B的 ...

  7. 包建强的培训课程(8):iOS与设计模式

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. IOS的设计模式

    对象创建 原型(Prototype) 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象. NSArray *array = [[NSArray alloc] initWithObject ...

  9. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. CF GYM 100703M It's complicate

    题意:龙要做茶,需要n种原料,给出他有的原料个数,和每份茶需要的原料个数,和每种原料的价格,要求做整数份茶,把他之前有的原料用完最少要花多少钱. 解法:水题. 代码: #include<stdi ...

  2. less命令

    less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览.用less命令显示文件时,用PageUp键向上翻页,用P ...

  3. 【Jenkins】Linux搭建Jenkins平台

    为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...

  4. UVA 11183 Teen Girl Squad 最小树形图

    最小树形图模板题 #include <iostream> #include <algorithm> #include <cstdio> #include <c ...

  5. iBatis之type

    iBatis下关于type的UML图,展示iBatis下关于类型的处理和注册等.

  6. C++基类和派生类之间的转换

    本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...

  7. 文件I/O操作(2)

    lseek函数原型为int lseek(int fd,int offset, int whence),fd为定位文件的描述符,offset为偏移量,如果是正数,则向文件末尾偏移,负数时,则向文件头偏移 ...

  8. 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate

    UVAlive 4794 Sharing Chocolate 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12055 ...

  9. HLA中常用的基本术语

    (1)联邦(Federation):用于实现某一特定仿真目的的分布仿真系统. (2)联邦成员(Federate):参与联邦的所有应用都称为联邦成员,简称成员. (3)对象(Object):构成成员的基 ...

  10. Idea的Git使用

    在使用Git来pull和push代码的时候会发生冲突的情况,如果处理不当则会出现无法pull和push代码的情况.所以这个是十分有必要注意的. 那么我来说几句自己的总结吧: 1.先看下idea的Git ...