浅谈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);