界面之间的消息传递主要有三种方法协议+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{
}