zoukankan      html  css  js  c++  java
  • 浅谈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);
  • 相关阅读:
    删除查询出以外的数据
    查询头3条
    查询共多少条记录
    Linq查询非泛型集合要指定Student类型(比如List)
    Linq to 泛型集合查询集合包括大写M和年龄小于等于18
    LINQ查询字符串判断是否大写
    LINQ查询数组里面是否包含某值
    Lambda表达式
    构建之法(四)
    构建之法(三)
  • 原文地址:https://www.cnblogs.com/guiyangxueyuan/p/5330424.html
Copyright © 2011-2022 走看看