代理 通知 和block传值的使用
在ios开发中,传值是频繁使用的,因为业务的需求,以及服务器的接口效果,功能需求等,使传值几乎成为必须使用的一个功能,然而传值的实现有很多种,正向传值,逆向传值,跨页面传值,以及跨页面调用方法
正向传值很简单,就不多说了,主要介绍一下逆向传值
什么是逆向传值
假设A为上级页面 B为下级页面 B页面向A页面传值即为逆向传值(一下皆以AB页面为根基 举例说明 )
block传值
block传值是一种对性能影响较小,使用十分方便的传值方法
传值过程分为三步
(例子为优惠券选择 优惠券列表界面为B页面,显示使用优惠券的页面为A页面)
1、在B页面定义block
#import <UIKit/UIKit.h>
typedef void (^RedPicketReload)(NSString *selectRedPicket);
@interface ChooseRedPicketViewController : UIViewController
@property(nonatomic ,strong)RedPicketReload redReload;
@end
2、在A页面调用block
ChooseRedPicketViewController *chooseVC = [[ChooseRedPicketViewController alloc]init];
chooseVC.redReload = ^(NSString *chooseID){
}
[self.navigationController pushViewController:chooseVC animated:YES];
3、在B页面传值
_redReload(chooseRedS);
代理传值以及跨页面调用方法
在使用MVVM开发模式的过程中,如何方便简洁的在VC界面调用ViewModel的方法,或者如何是ViewModel的点击事件在VC中实现呢
除了是用bolck之外还可以使用代理模式
(例子为优惠券选择 HomeTableView界面为B页面,VC页面为A页面)
假设在Home界面采用MVVM模式,把UITableView放入ViewModel中,并需要实现UITableView的头视图的点击事件
1、在B定义代理
#import <UIKit/UIKit.h>
@class HomeTableView;
@protocol HomeTableDelegate <NSObject>
- (void)bannerDidselectWith:(NSString *)selectURLString AndWithBannerDic:(NSDictionary *)dic;
@end
@interface HomeTableView : UITableView
@property(nonatomic,weak)id<HomeTableDelegate> HomeTableDelegate;
@end
2、在A界面关联代理
@interface HomeViewController ()<UITableViewDelegate,HomeTableDelegate>{
3、在B界面中调用代理
注意:调用代理前应做非空判断
if (_HomeTableDelegate && [_HomeTableDelegate respondsToSelector:@selector(bannerDidselectWith: AndWithBannerDic:)]) {
[_HomeTableDelegate bannerDidselectWith:@"传入标记值" AndWithBannerDic:传入参数];
}
4、在A界面中实现代理
- (void)bannerDidselectWith:(NSString *)selectURLString AndWithBannerDic:(NSDictionary *)dic{
}
通知的使用
在跨页面调用方法时,如果是非关联页面,或者是非相邻页面之间的方法调用,以及传值的时候,就需要是用代理,或者监听实现,KVO和KVC暂且不说,我们先说一下通知传值,和调用方法
1、在需要实现的页面添加通知
如果需要传值,选第一种,如果只是调用方法,选第二种
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(带参数方法:) name:@"通知标记" object:nil];
或者
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(不带参数方法) name:@"通知标记" object:nil];
2、在需要实现的页面实现方法
- (void)带参数的方法:(NSNotification *)notification{
获得参数
NSString * monthString = [notification object];
不带参数的方法可以直接实现
- (void)不带参数的方法{
}
}
3、在发起通知的页面发起通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"带参数的方法的通知标记" object:参数];
不带参数的方法
[[NSNotificationCenter defaultCenter]postNotificationName:@"不带参数的方法的通知标记" object:nil];
代理的使用方式和使用范围还有很多,block的使用方式和适用范围更广,通知和监听也是,现在介绍的只是其中的部分使用,后续还会继续介绍,希望大家关注