ios程序中传值的几种方式

通常情况下,在进行IOS程序设计时,我们通常需要将一些值进行传递,当Push一个ViewController时,我们一般都会使用属性进行传值,这样就会很容易满足我们的需求,但有些情况下,我们也需要将值从被Push的controller的值传递给上一级controller,这时,该属性就不能满足我们的需求,下面介绍几种传值的方法:

(一)使用属性传值:这是一种最简单也是最常见的方式,由于该方法是基本方法,就不一一介绍了;

(二) 使用NSUserdefault来储存值,由于NSUserdefault是一个单例对象,因此他在整个程序运行过程中,都能够保持数据的唯一性,由于这个比较简单,就不举实例了;

(三)使用协议的方式进行传值,协议是传值的另一种有效且有用的方式:

  通常的做法是:

  (1)首先在需要传值的controller里添加一个协议(注意一定是在.h文件里)

  @protocol tableViewSelectResultDelegate <NSObject>

  - (void)popoverViewSelectedResult:(NSDictionary *)resultDic;

  @end

  (2)在.m文件里我们需要在需要传值的地方调用该协议方法

  if ([self.delegate respondsToSelector:@selector(popoverViewSelectedResult:)]) {

        [self.delegate popoverViewSelectedResult:dic5];

    }

  (3) 在需要接受该值的地方,我们要遵该协议,并实现该协议,对传进来的数值进行相关处理

  - (void)popoverViewSelectedResult:(NSDictionary *)resultDic

  {

    NSLog(@"%@",resultDic);

  }

(四) 使用block块来进行传值

  在程序进行过程中,使用block块来进行传值是一种比以上方法更加行之有效的方法,也更加简洁方便:其基本原理就是,在哪个controller中调用另外一个对象的block方法或属性,那么该controller就可以获得由该方法或属性所带来的另一个对象的某些值。

  下面是一个示例,用来说明block块在传值时候的特性:

  (1)设置属性

  @property (nonatomic, copy) void (^selectRowAtIndex)(NSInteger index);

  (2)并在值改变的地方进行block传值:

  if (self.selectRowAtIndex) {

        self.selectRowAtIndex(indexPath.row);

    }

  (3)最后在另外的一个controller中调用他的这个属性:

  popview.selectRowAtIndex = ^(NSInteger index){ NSLog(@"select index:%d", index); };

  注意:当在(2)在执行时,会自动调用(3)中的属性,并且整个执行过程中,这个属性只会调用一次,也就是说,如果你在其他地方写了这个属性,那么他可能会调用其他的方法而不会调用(3)中的输出值函数。

    

原文地址:https://www.cnblogs.com/yuanjianguo2012/p/4074236.html