代理方法- 深入解析

今天结合一个实际的demo 来给大家讲解一下代理方法的运用

首先介绍一下 什么是代理,有什么用

/** 可以提高代买的复用性

*  代理的作用

1.封装变化点

2.解决类与类之间的强耦合性

3.可以在类之间进行数据传递

什么情况下使用代理好呢

1.有一系列变化点(比如:UIScrollView 有许多方法,)

能够让用户清晰的知道到底有哪些变化点被封装起来了

*/

我们在项目开发的过程中会用到很多的代理,block

两个之间有区别也有联系,代理和block 都可以用来传值

代理实现起来步骤比较多

简单的来说,代理就是委托,比如老板需要做一些事儿,老板不想去做,这时委托员工去做

那么员工就是老板的代理,员工是被动一方,老板是主动的一方

我们一般会拿协议来规范代理的行为,代理需要遵守协议,当发生委托时,老板就会通知代理去完成

代理可以实现对象之间的相互通信

今天结合UICollectionView 来讲解一下代理的运用

这个demo是按照mvc 的思想来完成的

我们想生产一个组件来提供给别人使用

我们需要把自己的组件安装在控制器之中,那么我们需要一个容器来存放这个UICollectionView

那么我们就提供一个UIVIew 来存放

新建一个类 继承自UIView 我们将UICollectionView 放在上面

这里还提供了一个自定义Item(cell) 使用xib 建立的,我们需要将cell 安装在UICollectionView上

自定义Item 有两个小空间 - 一个button 一个Label

我们想实现 :当用户点击cell 的button 时 我们把Label 的内容传递给我们

有两种解决方案:一种是利用用户交互,给cell 绑定事件,我们可以获得cell 的对象

另一种:设置代理

方法如下:

#import <UIKit/UIKit.h>

@interface QHCollectionView : UIView
+(instancetype)collectionView;
@end
#import "QHCollectionView.h"
#import "QHCollectionCell.h"

@interface QHCollectionView()<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,QHCollectionCellDelegate>

@property(nonatomic,strong)UICollectionView *collectionView;

@end

@implementation QHCollectionView

+(instancetype)collectionView
{
    return [[self alloc]init];
}

-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];

        UICollectionView *collectionView  = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;

        self.collectionView = collectionView;

        self.collectionView.delegate = self;
        self.collectionView.dataSource = self;

        self.collectionView.pagingEnabled = YES;

        self.collectionView.showsHorizontalScrollIndicator = NO;
//        self.collectionView
    }
    return self;
}

#pragma mark UICollectionViewDataSource 协议方法
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 10;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 2;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //注册机制
    /*
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"ABC"];

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ABC" forIndexPath:indexPath];
     */
    QHCollectionCell *cell = [QHCollectionCell cellWithCollectionView:collectionView andIndexPath:indexPath];

    cell.backgroundColor = [UIColor redColor];

    cell.delegate = self;
    return cell;

}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

    NSLog(@"8324823987");
}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(200, 200);
}

-(void)collectionCellWithBtnClick:(QHCollectionCell *)qhCollection andTextInfo:(NSString *)textInfo
{
     NSLog(@"百度员工号:%@", textInfo);
    NSLog(@"%@",NSStringFromSelector(_cmd));

}
-(void)willMoveToSuperview:(UIView *)newSuperview
{
    self.frame = newSuperview.bounds;

    self.backgroundColor = [UIColor purpleColor];

    self.collectionView.frame = self.frame;

    self.collectionView.backgroundColor = [UIColor yellowColor];

    //建立父子关系 设置frame

    [self addSubview:self.collectionView];

    //根据父控件设置子控件的frame
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end
#import <UIKit/UIKit.h>

@class QHCollectionCell;

@protocol QHCollectionCellClickDelegate <NSObject>

-(void)collectionCollectionClellClick:(QHCollectionCell *)qhCollection andCellView:(UIView *)view;

@end

@protocol QHCollectionCellDelegate<NSObject>

-(void)collectionCellWithBtnClick:(QHCollectionCell *)qhCollection andTextInfo:(NSString *)textInfo;

@end

@interface QHCollectionCell : UICollectionViewCell
@property(nonatomic,assign)id <QHCollectionCellDelegate>delegate;
@property(nonatomic,assign)id <QHCollectionCellClickDelegate>delegateC;
+(id)cell;
+(id)cellWithCollectionView:(UICollectionView *)collection andIndexPath:(NSIndexPath *)indexPath;
@end
#import "QHCollectionCell.h"

@interface QHCollectionCell()

@property (weak, nonatomic) IBOutlet UILabel *textLabel;

@end

@implementation QHCollectionCell

+(id)cell
{
    return [[self alloc]init];
}

+(id)cellWithCollectionView:(UICollectionView *)collection andIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellName = NSStringFromClass([self class]);

    UINib *nib = [UINib nibWithNibName:cellName bundle:nil];

    [collection registerNib:nib forCellWithReuseIdentifier:cellName];

    QHCollectionCell * cell = [collection dequeueReusableCellWithReuseIdentifier:cellName forIndexPath:indexPath];

   // UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tgrClick:)];

   // cell.userInteractionEnabled = YES;

   // [cell addGestureRecognizer:tgr];

    return cell;

}

-(void)tgrClick:(UITapGestureRecognizer *)tgr
{
    NSLog(@"%@",tgr.view);

    [_delegateC collectionCollectionClellClick:self andCellView:tgr.view];

}

- (IBAction)btnClick:(id)sender {

    NSString *textLabelInfo = self.textLabel.text;

    //NSLog(@"%@",self.textLabel.text);
    [self.delegate collectionCellWithBtnClick:self andTextInfo:textLabelInfo];

    NSLog(@"%@",self.delegate);

    NSLog(@"点击");
}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-02 04:40:59

代理方法- 深入解析的相关文章

Jquery.ajax报parseerror Invalid JSON错误的原因和解决方法:不能解析

(默认: 自动判断 (xml 或 html)) 请求失败时调用时间.参数有以下三个:XMLHttpRequest 对象.错误信息.(可选)捕获的错误对象.如果发生了错误,错误信息(第二个参数)除了得到 null 之外,还可能是 "timeout" , "error" , "notmodified" 和 "parsererror" . error事件返回的第一个参数XMLHttpRequest有一些有用的信息: XMLHttpR

ios开发网络学八:NSURLSession相关代理方法

#import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> /** 接受响应体信息 */ @property (nonatomic, strong) NSMutableData *fileData; @end @implementation ViewController -(NSMutableData *)fileData { if (_fileData == nil)

iOS对UIViewController生命周期和属性方法的解析

目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实例的传值陷阱 四.UIViewController与StroyBoard的相关相互方法 1.ViewController直接在StoryBoard中进行跳转的传值 2.使用代码跳转Storyboard中的controller 五.UIViewController之间的一些从属关系 1.parentV

【iOS开发】iOS对UIViewController生命周期和属性方法的解析

iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这篇博客,旨在讨论UIV

弃用的异步get和post方法之代理方法

1 #import "ViewController.h" 2 #import "Header.h" 3 4 @interface ViewController () <NSURLConnectionDataDelegate> 5 6 /** 7 * 用来存储数据 8 */ 9 @property (nonatomic, strong) NSMutableData *resultData; 10 11 @property (nonatomic, stron

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

mybatis系列笔记(2)---mapper代理方法

mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下: (2)mapper.xml中namespace等于mapper接口的地址 (3)Usermapper.java接口中国的方法名和Usermapper.xml中statement的id一致 <!-- 7综

mybatis学习笔记,mapper代理方法的使用

一.开发人员需要完成的任务: mapper.xml映射文件和mapper.java 二.开发规范 1.在mapper.xml中namespace等于mapper接口地址. 2.mapper.java接口中的方法名和mapper.xml中statement的id一致 3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致. 4.mapper.java接口中的方法返回值类型和mapper.xml中statement的re

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

收集购物信息  iOS项目 倒计时:588 步骤 /.panel-heading 项目需求 设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话.并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击. #import "TableViewController.h" @interface TableViewController ()<UIAlertViewDelegate> @property (nonatomic, strong)