iOS开发中的设计模式----代理模式

代理模式是很常见的一种设计模式,在我们使用UITableView和UICollectionView时,需要设置代理并重写系统提供的代理方法。

代理模式,主要有两方:委托方和代理方

可以简单的理解为:委托方需要做一件事,但是不想自己做,所以需要把这件事委托给其它可以做这件事(协议)的人,也就是代理方,所以委托方需要指明代理方是谁,并且需要告诉代理方在什么情况下去做这件事。

在iOS开发中,抽象成为:对象A为委托方,并制定协议,指定B为代理方,所以B要遵守这个协议,并且需要实现协议的内容也就是要实现协议中的方法。

写一个简单的例子:点击屏幕,让A控制器跳到B控制器,点击屏幕从B回到A,同时改变A的背景颜色,通过代理的方法来实现

简单分析:B回到A的时候让A的背景颜色改变,所以A是实施的一方,即代理方,而B就是委托方。

//控制器A
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

#import "ViewController.h"
#import "MyViewController.h"
//遵守协议
@interface ViewController ()<MyDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}
//点击屏幕跳到第二个控制器中
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    MyViewController * vc = [[MyViewController alloc] init];
    //设置第二个控制器的代理为第一个控制器对象
    vc.delegate = self;
    [self presentViewController:vc animated:YES completion:nil];
}
//协议方法,改变第一个控制器的背景颜色
- (void)changeBackgroundColor{
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:0.5];
}
@end
//控制器B
#import <UIKit/UIKit.h>
//制定协议
@protocol MyDelegate <NSObject>

- (void)changeBackgroundColor;

@end
@interface MyViewController : UIViewController
//声明一个代理属性
@property (nonatomic, weak) id <MyDelegate> delegate;
@end

#import "MyViewController.h"

@interface MyViewController ()

@end

@implementation MyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
}

//点击屏幕
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //回到第一个控制器,并执行协议方法来改变第一个控制器的背景颜色
    [self dismissViewControllerAnimated:YES completion:^{
        if ([self.delegate respondsToSelector:@selector(changeBackgroundColor)]) {
            [self.delegate changeBackgroundColor];
        }
    }];
}
@end

运行结果



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bright1st

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值