iOS代理、block、通知传值

一般正向传值基本使用属性传值,这里不多讲。如果需要逆向传值,基本使用代理和block,也可以使用通知。这些基本都会使用,但是平时写的少,所以做一个总结。

1.代理传值
委托方:
<1>.委托方.h文件interface之上写协议

@protocol SendValueDelegate 
- (void)sendValue:(NSString*)value;
@end
@interface SecondViewController : UIViewController

<2>.实例化协议变量

@property(nonatomic,assign)iddelegate;

<3>.协议变量响应协议方法(传值)

//一般写在返回方法或viewWillDisappear中
if ([_delegate respondsToSelector:@selector(sendValue:)]) {
        [_delegate sendValue:text.text];
 }

代理方:
<1>.遵循代理协议

@interface FirstViewController ()

<2>.设置代理

    SecondViewController * Second = [[SecondViewController alloc]init];
    Second.delegate = self;

<3>.实现协议方法

- (void)sendValue:(NSString *)value{
    label.text = value;
}

做好以上六步,逆向传值不是问题

2.block传值
在进行block传值时,因为block写法比较怪异,所以先对block做一个简单地复习。
先来一个简单的block:

BOOL (^getValue)(int) = ^(int input) { 
if (input % 2 == 0) { 
return YES;
 } else {
 return NO;
 }}; 
//调用
getValue(3);

block以后会做深入的分析,接下来主要是传值部分
第一个页面
<1>.先用typedef对block做一个简单的包装
逆向传值时,写在第二个页面头文件的interface之上

typedef void (^sendValueBlock)(NSString * firstValue);

<2>实例化这个block

@property(nonatomic,copy)sendValueBlock valueBlock;

<3>相关方法内对block赋值

- (void)viewWillDisappear:(BOOL)animated{
if(!self.valueBlock){
    self.valueBlock(text.text);
}
}

第二个页面
<1>在点击进入下一个页面的方法中进行传值

 SecondViewController * Second = [[SecondViewController alloc]init];  
 Second.valueBlock = ^(NSString * first){
        lab.text = first;
   };

两种方式传值,block更简易写,缺点是不大容易书写,习惯就好...

3.现在简单谈些notification传值
<1>发送通知,把值写到字典中并赋给userInfo

 NSDictionary * dict = [NSDictionary dictionaryWithObject:web forKey:@"website"];
 NSNotification * notice = [NSNotification notificationWithName:@"reloadWebview" object:nil userInfo:dict];
 [[NSNotificationCenter defaultCenter]postNotification:notice];

<2>接受通知

NSNotificationCenter * reloadCenter = [NSNotificationCenter defaultCenter];
    [reloadCenter addObserver:self selector:@selector(reloadWebsite:) name:@"reloadWebview" object:nil];

<3>实现方法

- (void)reloadWebsite:(NSNotification *)notice{ 
    NSString * website = [notice.userInfo objectForKey:@"website"];
}

通知可能更容易理解和书写,但是有时通知太多不太容易跟踪,三者各有各自的好处和适用场景,在此仅以简单记述。

你可能感兴趣的:(iOS代理、block、通知传值)