逆向传值和跨页面传值以及方法调用

代理 通知 和block传值的使用

 在ios开发中,传值是频繁使用的,因为业务的需求,以及服务器的接口效果,功能需求等,使传值几乎成为必须使用的一个功能,然而传值的实现有很多种,正向传值,逆向传值,跨页面传值,以及跨页面调用方法

正向传值很简单,就不多说了,主要介绍一下逆向传值

什么是逆向传值

假设A为上级页面 B为下级页面  B页面向A页面传值即为逆向传值(一下皆以AB页面为根基 举例说明 )

block传值

block传值是一种对性能影响较小,使用十分方便的传值方法
传值过程分为三步
(例子为优惠券选择 优惠券列表界面为B页面,显示使用优惠券的页面为A页面)
1、在B页面定义block 
#import 
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 
@class HomeTableView;
@protocol HomeTableDelegate <NSObject>

- (void)bannerDidselectWith:(NSString *)selectURLString AndWithBannerDic:(NSDictionary *)dic;

@end

@interface HomeTableView : UITableView
@property(nonatomic,weak)id  HomeTableDelegate;

@end
2、在A界面关联代理
@interface HomeViewController (){
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的使用方式和适用范围更广,通知和监听也是,现在介绍的只是其中的部分使用,后续还会继续介绍,希望大家关注

你可能感兴趣的:(方法篇)