iOS开发中的常见的几种逆向传值方式

来源:互联网 发布:飞鹰编辑软件 编辑:程序博客网 时间:2024/05/16 12:07

  传值(两个页面之间的传值或者两个VC之间传值)


绝对禁止给成员变量用类方法赋值,因为无法控制。



一、正向传值看点击打开链接(界面14之间的传值。)

简单说就是在需要得到值的类中做一个属性,用来接受将要传来的值。

在赋值界面实例化当前界面并调用属性赋值。(赋值一定要在push界面之前进行。)

到了得值界面调用得值变量 = self.属性进行传值。



 二、今天主要看反向传值


1.代理传值------随便用---一对一,触发与被触发两个类之间的传值,途径协议方法的参数。(被block代替了)---------相册 

在第二个页面声明代理和协议方法,并将其作为属性。 

#import<UIKit/UIKit.h>



@protocol SecondDelegate <NSObject>


//改变first里面label所显示的内容,改为newStr

-(void)changeTextTo:(NSString *)newStr;


@end


@interface SecondViewController :UIViewController<UITextFieldDelegate>


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


@end

然后在.m文件中想要传值的控件写:textField1.delegate =self;

然后在第一个页面中包含协议方法,最后实现协议方法。second.delegate = self;把自己给了第二个页面,//second.delegate调用协议方法时,就相当于self在调用,所以用first这个页面实现

源码参考:点击打开链接

核心就在触发类.delegate = self ”,把当前类赋给协议属性。所以在self中实现协议方法。


2.单例传值-------随便用(单例属性赋值后,哪儿都可以用。)-------判断系统版本,已设定起始Y坐标(继承)

建一个单例类,如果有必要,可以加一个需要的属性。

Eg

.h文件:

@property(nonatomic,retain)NSString *newStr;


+(id)shareInstance;


.m文件:

staticValue *value = nil;


@implementation Value


-(void)dealloc

{

    self.newStr = nil;

    [superdealloc];


}



+(id)shareInstance

{

    static dispatch_once_t onceToken ;

    dispatch_once(&onceToken, ^{

        value = [Value alloc];

    });

  

    return value;

}

@end

然后再传值页面包含类,实例化,给其赋值


    Value *value = [Value shareInstance];

    value.newStr =@"中午吃饭不要钱";

然后在接受页面同样实例化单例类:

然后接到value.newStr值就传过来了。

详细参考代码: 点击打开链接


3.NSuserDefaults传值(一般只用在保存账号密码,登录状态,针对小数据,如果大了,不让上线。)-----做一个保存账号密码、下次再启动应用自动登录。

第一个页面执行写入需要的东西:
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];

    [usersetObject:@"china55lllz@hotmail.com"forKey:@"count"];

    [usersetObject:@"111111"forKey:@"password"];

    [user synchronize];


取回页面执行如下操作:

NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];

   NSString *str =  [user objectForKey:@"count"];//可以根据需求将值写在页面上。

详细参考:

 点击打开链接

4.文件传值--------本地持久化(离线的工作,把服务器取回来的数据存在本地沙盒目录下,然后下次直接读文件取用。任何情况下,你有一个数据想给别的类用,可以把这个数据write到文件,然后别的类读这个文件。)

5.通知传值(一个发起者,一堆接收者,不需要协议,直接通过系统的通知中心工作notificationCenter

在传值页面执行如下代码发通知:

NSNotificationCenter *center =   [NSNotificationCenterdefaultCenter];

   //第二个参数object是我们要传的值,接受那边会受到这个值。,这个参数必须是对象。[NSString stringWithFormat:@"%d",num]就是发出去的值.

   NSNotification *notify = [NSNotificationnotificationWithName:@"zengzhiwei"object:[NSStringstringWithFormat:@"%d",num]];

    [center postNotification:notify];


在接收页面:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    [center addObserver:self selector:@selector(secondDoWithNotification:) name:@"zengzhiwei" object:nil];

//第一个参数是目标(将要干活的对象),第二个参数是方法(要干的活),第三个参数是我正在观察的内容,要与发出者一致,第四个参数是观察者的参数,是给中心用的,我们暂时不关心。




//因为这次发送的zengzhiwei是带参数的,(执行对应方法。)

-(void)secondDoWithNotification:(NSNotification *)notice

{

    NSString *object = [notice object];//把收到的通知参数转为字符串。

   if([object intValue ] == 0 )

   {

    //删上面的按钮

       UIButton *btn = (UIButton *)[self.view viewWithTag:1000];

       [btn removeFromSuperview];

   }else{

    //删下面的按钮

        UIButton *btn = (UIButton *)[self.view viewWithTag:1001];

       [btn removeFromSuperview];

   }


}

详细参考源码:点击打开链接


0 0