浅谈iOS设计中关于传值的问题

     在iOS设计开发的过程中,传值是可以说是最重要的一个部分,比较常用的方式有三种。

其一:正向传值 正向传值使用的也是比较多的,这个还是很简单的 例如:

在AVC想把值传给BVC,只需要在BVC.h中定义一个承接的属性变量在AVC中赋值即可(注意:⚠️最好是用不需要初始化的东西去承接,如:NSString,NSArray,NSinteger等,不可用例如Label.text等需要初始化的控件属性)

其二:

反向传值(这个是传值的主要方面也是主要的难点)

反向传值又可以分为三种方式

1、代理传值

2、block传值

3、通知传值

下面为仔细说说这三种传值方式的特点和使用技巧

代理传值:

代理传值一般用于两个相邻的视图之间,即AVC和BVC之间是可以相互跳转的,(例如:TableView,TableViewCell)

代理传值一般有五个步骤:

(1).在BVC的.h中定义

@protocol BViewControllerDelegate   //创建代理 

(2).在BVC的.h中定义代理方法

  • (void)BViewController:(BViewController )theViewController withData:(NSDictionary )data;//声明代理方法

(3).在BVC的.h中设置代理

@property(nonatomic,weak)id BVCDelegate;//声明代理属性对象

(4).在BVC.m中判断并实现代理方法

//实现代理方法

if (_BVCDelegate!=nil && [_BVCDelegate respondsToSelector:@selector(BViewController:withData:)]) { [_BVCDelegate BViewController:self withData:data]; break; }

(5).在AVC.m中调用BVC的代理方法 在初始化BVC的时候

BViewContorller *BVC = [[BViewContorller alloc]init]; BVC.BVCDelegate = self;

  • (void)BViewController:(BViewController )theViewController withData:(NSDictionary )data{ NSLog(@"%@",data); }

2、block传值

block传值比较简单,分为三步

(1).在BVC.h中定义block

import typedef void (^numReload)(float number, NSArray *selectArray); @interface BViewController : UIViewController @property (nonatomic ,strong)numReload BReloadd;

(2).在BVC.m中,在你结算完数据的地方

_BReloadd(theNumber ,theArray);

(3).在AVC.m中

在你初始化BVC的地方,加上回调

BVC.BReloadd = ^(float reloadNumber ,NSArray *reloadArray){

}

3.通知传值 通知传值的适用范围比较广,不仅仅局限于相邻的视图或者有关联的视图,通知的传值几本是面向于整个应用的 通知传值分为两步: 即:发出通知和接受通知 创建通知

NSDictionary tongzhiDic = [[NSDictionary alloc]initWithObjectsAndKeys:_tongzhiButton.titleLabel.text,@"tongzhizhi", nil]; NSNotification notifica = [NSNotification notificationWithName:@"tiaozhuan" object:nil userInfo:tongzhiDic]; [[NSNotificationCenter defaultCenter] postNotification:notifica];

接受通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhiClick:) name:@"tiaozhuan" object:nil];

接受到通知需要进行的操作

  • (void)tongzhiClick:(NSNotification *)tiaozhuan{

}

除去上面的四种传值方式还有本地化数据存储和读取

分为:归档解档和NSUserDefaults

NSUserDefaults的使用和适用范围

NSUserDefaults适用于极小型数据存储(当然也可以存储不是太大的数据,只是没有那个必要)注意事项为:如果存储字典类型的数据,其中字典的value值中不许为nil

NSUserDefaults的使用方法:

NSUserDefaults uesr = [NSUserDefaults standardUserDefaults]; NSString pingceStr = [uesr objectForKey:@"存储的数据"];存储数据方法 NSUserDefaults *defaus = [NSUserDefaults standardUserDefaults];//删除数据方法 [defaus removeObjectForKey:@"存储的数据"];

归档和解档的使用

这个使用范围比较广一些,一般的使用时存储数组和字典或者存储一些model数据

下面以数组为例:
归档:

NSArray *theArray = @[@"2",@"2",@"3"];
NSMutableData *data = [[NSMutableData alloc]init];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archive encodeObject:theArray forKey:@"person"];
[archive finishEncoding];//这一步为必需步骤(结束归档编码)

解档:

NSKeyedUnarchiver  *unArchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
NSArray *array = [unArchive decodeObjectForKey:@"person"];
NSLog(@"arraay == %@",array);
posted @ 2016-03-28 20:19  右手指尖轻轻触  阅读(158)  评论(0编辑  收藏  举报