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

一、说明:

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];
}




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值