【iOS-开发】:delegate(委托、代理)模式的设置方法

原创 2016年08月30日 21:43:21

一、说明:

1.委托者:设置代理协议的类

2.代理者:接受委托者代理的类

二、实现步骤:

1、在类TYBoardController.h中定义一个protocol代理协议,并声明一个协议的属性变量(注意用assign修饰,用strong会造成循环引用)

#import <UIKit/UIKit.h>

@protocol TYBoardControllerDelegate <NSObject>

- (void)imageDataArray:(NSMutableArray *)imageDataArray andImageArray:(NSMutableArray *)imageArray;

@end

@interface TYBoardController : UIViewController

@property (nonatomic, assign) id<TYBoardControllerDelegate> delegate;

@end

2、让TYBoardController在适当的时候向代理对象A发送消息,比如触发save按钮时。

#pragma mark - 保存
- (void)save {
    // 通知代理
    if ([self.delegate respondsToSelector:@selector(imageDataArray:andImageArray:)]) {
        [self.delegate imageDataArray:self.imageDataArray andImageArray:self.imageArray];
    }
}

3、让类TYBrowserController遵从代理协议,通知TYBoardController,现在TYBrowserController是它的代理

@interface TYBrowserController ()<UICollectionViewDelegate, UICollectionViewDataSource, TYBoardControllerDelegate>

@property (nonatomic, strong) NSMutableArray   *imageArray;
@property (nonatomic, strong) NSMutableArray   *imageDataArray;

@property (nonatomic, strong) TYBoardController *boardVC;

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"列表";
    self.view.backgroundColor = [UIColor whiteColor];

    self.boardVC.delegate = self;
}

4、在TYBrowserController.m中实现代理方法

#pragma mark - 代理方法
- (void)imageDataArray:(NSMutableArray *)imageDataArray andImageArray:(NSMutableArray *)imageArray
{
    self.imageArray = imageArray;
    self.imageDataArray = imageDataArray;
    [self.collectionView reloadData];
}

三、遇到的问题及原因

在实际应用中,设置完以上步骤后却一直不能实现传值的功能,在第二步的if语句外面打印self.delegate的值,一直是self.delegate = null,在if语句处打断点,看到执行到if语句时不会进到语句内部,应该是respondstoselector没找到代理方法,可是代理方法明明已经在前面那个类中实现了。

后来仔细检查代码,发现在TYBrowserController控制器push到TYBoardController时,我又新建了一个TYBoardController的对象boardVC,页面跳转到这个新对象里面去了,没有push到self.boardVC里。新建的boardVC跟self.boardVC是完全不同的变量,所以设置self.boardVC.delegate = self与实际的委托者boardVC是无关的,等于没有给委托者设置代理,修改后恢复正常。

// 修改前
- (void)pushToBoardVC {
    TYBoardController *boardVC = [[TYBoardController alloc] init];
    
    [self.navigationController pushViewController:boardVC animated:YES];
}

// 修改后
- (void)pushToBoardVC {
    [self.navigationController pushViewController:self.boardVC animated:YES];
}




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

IOS-自定义代理

实现功能:创建一个带导航功能的两个视图控制器(从一个窗口跳转到另一个窗口),第二个窗口创建两个按钮,标题分别为红色和绿色,点相应的按钮弹回前一个窗口,同时前一个窗口的背影色变成按钮标题指示的颜色(通过...
  • emperorzhi
  • emperorzhi
  • 2015年05月28日 08:34
  • 5359

iOS开发笔记--代理方法

委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容...
  • hopedark
  • hopedark
  • 2014年01月29日 10:59
  • 8228

详述 IOS 之代理模式(Objective-c)

1. 什么是代理模式? 代理模式是在 IOS 中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和...
  • huangfei711
  • huangfei711
  • 2016年09月07日 17:17
  • 686

ios中关于delegate(委托)的使用心得

从开始从事OC工作到现在大概1年多了,从当初接触oc的"协议"的不明白,到现在代码中随处可见的委托,协议,其中感悟颇多。 首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自...
  • huifeidexin_1
  • huifeidexin_1
  • 2012年05月15日 10:54
  • 134547

iOS设计模式——委托(delegate)

委托(delegate)也叫代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。 什么是代理? 苹...
  • lovefqing
  • lovefqing
  • 2012年12月11日 19:52
  • 59041

iOS中几种设计模式(一)———— 代理模式

代理:说的通俗一点就是自己做不了的事情,交给代理来做。 在这里通过一个例子来说明代理的使用。 1.实现一个例子,说明将要实现的功能:在一个视图控制器上定义一个lable1,一个button1(为了...
  • backAFENG
  • backAFENG
  • 2014年08月08日 20:46
  • 559

ios代理(Delegate)机制深入学习和探讨

Delegate(代理/委托)在iOS中很常用,似乎很简单,但许多ios编程多年的人对其本质也不太理解,只是按照API的要求,简单使用。本文根据作者的体会,试图简单明了的说清Delegate的本质,以...
  • xotty
  • xotty
  • 2016年09月13日 12:38
  • 360

IOS学习之一个示例弄懂代理(delegate)和协议

协议在这里就像中间人的作用,没有这个中间人,就无法”受理代理”。注意代理和协议并不是总要一起实现,只是大部分情况下我们会用协议来辅助实现代理。...
  • pony_maggie
  • pony_maggie
  • 2014年05月12日 22:02
  • 35434

查看代理方法的实现并调用(ios)

if (self.delegate != NULL && [self.delegate respondsToSelector:@selector(awesomeAlertViewButtonTou...
  • hxmcnu
  • hxmcnu
  • 2016年01月13日 14:00
  • 1314

iOS:代理(delegate)理解及使用

子控件需要子控件所在的控制器来帮其做一些事情,此时子控件需要通过代理模式实现.   举例:         控制器OneViewController里有一个子控件叫SubView(自定义View), ...
  • sinat_30993547
  • sinat_30993547
  • 2016年03月29日 00:07
  • 1894
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【iOS-开发】:delegate(委托、代理)模式的设置方法
举报原因:
原因补充:

(最多只允许输入30个字)