ios常用的几种反向传值

来源:互联网 发布:java字符流写入文件 编辑:程序博客网 时间:2024/05/19 16:22

    在程序代码编写过程中,避免不了传值的情况。传值分为两种,一种是正向传值,直接从A页面 push 到B页面,带数据和消息过去就可。那反向传值怎么操作?

   一般常见的有代理,block,通知,单例...

 1.代理,这是我个人最常用的 。

    代理怎么实现反向传值,可以分为以下几个步骤:

   第一步:定义协议(代理)

  @protocol myDelegate <NSObject>

   //这是协议方法

   -(void)changeLabel:(NSString *)str;

  @end

  第二步:定义代理指针 

  @property(nonatomic,assign)id <myDelegate>delegate;

  第三步:回调(如果不回调,是完成不了传值的)

  if(self.delegate&&[self.delegaterespondsToSelector:@selector(changeLabel:)])

    {

        [self.delegatechangeLabel:_textF.text];

    }

  前三步都是在需要传值的类实现的,接下来的三个步骤是在需要接受类中实现的

  第四步:继承协议

  @interfaceViewController ()<myDelegate>

  第五步:使用代理

  vc.delegate=self;

  第六步:实现协议方法

  -(void)changeLabel:(NSString *)str

 {

   _label.text=str;

  }


  

2.通知来实现

 第一步:发通知(发消息)  在传值类中实现

  [[NSNotificationCenter defaultCenter] postNotificationName:@"通知频道" object:nil   userInfo:@{@"name":_textF.text}];

 第二步:注册通知(接受消息) 在接受类中实现

   [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(labelText:)name:@"通知频道"object:nil];

 第三步:实现方法 

   -(void)labelText:(NSNotification *)not

   {

   NSDictionary *dict = [notuserInfo];

   _label.text=dict[@"name"];

    }

 注意:通知要手动释放 

  -(void)dealloc

  {

  [[NSNotificationCenterdefaultCenter]removeObserver:self];

  }

 
  通知和代理,blockd 的区别  通知可以一对多,而代理和block只能一对一

3.单例 
   单例的原理是整个应用程序就一个应用对象,全局共享一块内存空间,节省内存资源
  
   通知设置单例的一个属性,来访问这个单例的话,得到都是同一个。
   
   我们知道整个应用程序就是一个单例 ,所以  
   发送的类

    获取当前程序的单例

    AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;

    appdelegate.string = _textF.text;

   接受的类:
    AppDelegate *app = [UIApplication sharedApplication].delegate;

   _label.text = app.string;


4.block(代码块)  

   第一步:定义block变量

   @property(nonatomic,copy)void (^myBlock) (NSString *);

    返回值的类型  (^block的名称) (参数类型)

   第二步 :回调

   if(self.myBlock)

   {

      self.myBlock(_textF.text);

    }

   第三步:实现block 

   vc.myBlock =  ^(NSString *str)

    {

       _label.text =str;

    };

 

0 0