IOS界面之间的消息传递(delegate+block +NSNotificationCenter)

界面之间的消息传递主要有三种方法协议+block+NSNotificationCenter)

一: block界面之间消息传递的最简单方式,但最大的缺陷就是只能在存在父、子视图关系的界面之中传递,而不能夸多个界面传递。其实现方式如下


//在需要传递数据的.h 文件中定义block,设置其参数及返回值
//定义block
typedef void(^ContentBlock)(NSInteger page,kDirection direction,CGFloat rate,BOOL isStop);

@interface ZQYContentView : UIView

@property(nonatomic,copy)ContentBlock block;



//在 .m文件中 传递数据 如有返回值 可直接定义返回值同类型的参数接受
//如下列假设有一个Nsinterge类型返回值要接受 则
// NSInteger t = self.block(page, kDirectionNone, 0, YES);


//停下来了
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    //计算停在第几页
    NSInteger page = scrollView.contentOffset.x / self.scrollView.width;
    
    if (self.block) {
        self.block(page, kDirectionNone, 0, YES);
    }
    
}

//在需要接收数据的界面的 .m文件中导入头文件
//定义弱引用 防止循环引用
__weak typeof (self ) weakSelf = self;
 //接受contentVIew传过来的数据
    [_contentView setBlock:^(NSInteger page, kDirection direction, CGFloat rate, BOOL isStop) {
        //判断页面是否停止滚动
        if (isStop == YES) {
            [weakSelf.headerView selectItemAtIndex:page];
        }else{
            //在滚动过程中
            [weakSelf.headerView setScaleRate:rate Direction:direction];
        }
    }];

二、使用用NSNotificationCenter进行消息传递,但缺点是不能设置返回值,且最大的缺点是容易因为命名重复而到时消息出错,即不安全。实现方式如下

//头文件中定义消息名称 采用宏定义消息名 最大程度上减少消息书写书写次数
#define 
kPhotoViewChangeToEditStatusNotificationName @"kPhotoViewChangeToEditStatusNotificationName"

//发送消息的界面中发送消息
        [[NSNotificationCenter defaultCenter] postNotificationName:kPhotoViewChangeToEditStatusNotificationName object:nil];


//接受消息的界面中接受消息 添加消息接受者 及收到消息之后做什么
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeToEdit) name:kPhotoViewChangeToEditStatusNotificationName object:nil];


三、协议、代理实现消息传递 此处又包括两种形式 1.重写一个protocol文件来单独定义协议方法 。 2、就在需要发送消息或要获取返回值的界面中定义协议,这个放大逻辑相对简答,但易造成代码臃肿,影向阅读

1.另写协议方式
a.重写一个protocol协议
在这里插入图片描述
在这里插入图片描述
b.在发送数据的界面导入接受数据的界面,执行如下代码

   //将状态传递
    //ViewController继承与UIViewController;
    ViewController * vc = (ViewController *)[UIApplication sharedApplication].keyWindow.rootViewController;
    
    //传递数据
    if ([vc respondsToSelector:@selector(phtotoViewStatusChanged:index:)]) {
        [vc phtotoViewStatusChanged:status index:_model.index];
        //如有返回值,可在上式直接接接收
    }
    

c.在接受消息的界面首先服从协议,然后实现其方法

-(void)phtotoViewStatusChanged:(PhotoViewStatus)status index:(NSInteger)index{

}

2.本界面定义协议

a.传出数据的界面 .h文件中定义协议
在这里插入图片描述
b.m文件中查看要是接收界面服从了协议,并实现了此方法,则传出什么数据,同时是否需要接收返回值



    if ([self.delegate respondsToSelector:@selector(phtotoViewStatusChanged:index:)]) {
        [self.delegate phtotoViewStatusChanged:status index:_model.index];
        //如有返回值 可直接接收
    }
    

c.接收界面中服从协议,设置代理 实现方法
在这里插入图片描述
在这里插入图片描述

-(void)phtotoViewStatusChanged:(PhotoViewStatus)status index:(NSInteger)index{

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值