iOS-常见的页面传值方式

背景:

iOS开发中,页面传值是必不可少的。很多时候,控制器之间的传值是很常见。下面,我总结几种常见的页面传值方式,记录下来,方便以后查看。


预备工作:

准备两个控制器,第一个控制有一个UIButton和一个UILabel,第二个控制器有一个UITextField和一个UIButton。
以下的页面传值都围绕这两个控制器来演示。
代码如下:

#import "OneViewController.h"
#import "TwoViewController.h"

@interface OneViewController ()

/**显示文字的Label*/
@property(nonatomic,strong) UILabel *ZFLabel;
/**跳到第二个控制器的Button*/
@property(nonatomic,strong) UIButton *ZFBtn;

@end

@implementation OneViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self setupControls];
}

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    twoVC.str = @"我是属性传值";
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

-(void)setupControls
{
    self.ZFLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 40)];
    self.ZFLabel.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:self.ZFLabel];

    self.ZFBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.ZFBtn.frame = CGRectMake(100, CGRectGetMaxY(self.ZFLabel.frame) + 10, 150, 30);
    [self.ZFBtn setTitle:@"跳转到第二个控制器" forState:UIControlStateNormal];
    [self.ZFBtn addTarget:self action:@selector(ZFBtnAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.ZFBtn];
}

@end

#import "TwoViewController.h"

@interface TwoViewController ()

/**输入框*/
@property(nonatomic,strong) UITextField *ZFTextField;
/**回到第一个控制器的Button*/
@property(nonatomic,strong) UIButton *ZFBtn;

@end

@implementation TwoViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self setupControls];

}

-(void)ZFBtnAction
{
    [self dismissViewControllerAnimated:YES completion:^{

    }];
}

-(void)setupControls
{
    self.ZFTextField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 40)];
    self.ZFTextField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:self.ZFTextField];


    self.ZFBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.ZFBtn.frame = CGRectMake(100, CGRectGetMaxY(self.ZFTextField.frame) + 10, 150, 30);
    [self.ZFBtn setTitle:@"回到第一个控制器" forState:UIControlStateNormal];
    [self.ZFBtn addTarget:self action:@selector(ZFBtnAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.ZFBtn];
}

@end

一、属性传值

属性传值,顾名思义,在控制器里面定义一个属性,然后把值赋值给该控制器属性。属性传值,常用于正向传值,即一个控制器跳转到另一个控制器时候,把值传递给第二个控制器。

核心代码:

OneViewController控制器:

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    twoVC.str = @"我是属性传值";
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

TwoViewController控制器:

self.ZFTextField.text = self.str;

二、单例传值

单例传值,就是创建一个单例对象,然后把值付给单例对象的属性。无论在哪个控制器,只要调用这个单例对象,就能获取单例对象属性的值。单例传值,可以用于正向、反向传值。

单例对象:

#import <Foundation/Foundation.h>

@interface singleton : NSObject

@property(nonatomic,strong) NSString *str;

/**
 获取单例对象

 @return 当前对象
 */
+(singleton *)shareInstance;

@end
#import "singleton.h"

@implementation singleton

+(singleton *)shareInstance
{
    static singleton *zfInstance;
    if (!zfInstance) {
        zfInstance = [[singleton alloc] init];
    }
    return zfInstance;
}

@end

OneViewController控制器:

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    singleton *zfInstance =  [singleton shareInstance];
    zfInstance.str = @"我是单例传值";
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

TwoViewController控制器:

    singleton *zfInstance = [singleton shareInstance];
    self.ZFTextField.text = zfInstance.str;

三、NSUserDefaults传值

每个应用程序都有一个自己的沙盒,而NSUserDefaults就是存在于沙盒里面,系统已经为我们创建好了,我们只需要直接使用就好。NSUserDefaults可以用于正向、反向传值。

OneViewController控制器:

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:@"我是NSUserDefaults传值" forKey:@"ZFKey"];
    [ud synchronize];
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

TwoViewController控制器:

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSString *str = [ud objectForKey:@"ZFKey"];
    self.ZFTextField.text = str;

四、代理传值

代理传值,是苹果开发中最经典的传值方式,常用语反向传值,即从一个控制器到另一个控制器,再由第二个控制器返回到第一个控制器,并且把值从第二个控制器传回到第一个控制器。代理传值比较麻烦,需要定义委托方、代理,而代理需要遵守协议。

OneViewController控制器:

@interface OneViewController ()<transmitValueDelegate>

/**显示文字的Label*/
@property(nonatomic,strong) UILabel *ZFLabel;
/**跳到第二个控制器的Button*/
@property(nonatomic,strong) UIButton *ZFBtn;

@end

@implementation OneViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self setupControls];

}

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    twoVC.delegate = self;
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

-(void)transmitStr:(TwoViewController *)twoVC str:(NSString *)str
{
    self.ZFLabel.text = str;
}

TwoViewController控制器:

#import <UIKit/UIKit.h>
@class TwoViewController;

@protocol transmitValueDelegate<NSObject>
@optional
-(void)transmitStr:(TwoViewController *)twoVC str:(NSString *)str;
@end

@interface TwoViewController : UIViewController

@property(nonatomic,weak) id <transmitValueDelegate> delegate;

@end
-(void)ZFBtnAction
{
    if ([self.delegate respondsToSelector:@selector(transmitStr:str:)]) {
        [self.delegate transmitStr:self str:@"我是代理传值"];
    }

    [self dismissViewControllerAnimated:YES completion:^{

    }];
}

五、Block传值

Block传值是苹果推荐的一种传值方式,和代理传值一样,常用语反向传值。Block传值写法比代理传值简单,也是比较流行的一种写法。

OneViewController控制器:

-(void)ZFBtnAction
{
    TwoViewController *twoVC = [[TwoViewController alloc] init];
    twoVC.ZFBlock = ^(NSString *str) {
        self.ZFLabel.text = str;
    };
    [self presentViewController:twoVC animated:YES completion:^{

    }];
}

TwoViewController控制器:

#import <UIKit/UIKit.h>

@interface TwoViewController : UIViewController

@property(nonatomic,copy) void(^ZFBlock)(NSString *);

@end
-(void)ZFBtnAction
{

    self.ZFBlock(@"我是block传值");
    [self dismissViewControllerAnimated:YES completion:^{

    }];
}

六、通知传值

在苹果开发中,通知更是常见。我们用不但可以用通知进行传值,还能用通知给其他控制器发送其他信号、消息,比如键盘弹出消息等等。通知传值不但可以一对一,还可以一对多,多对多。
OneViewController控制器:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self setupControls];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveMessage:) name:@"notiTransmitValue" object:nil];
}

-(void)receiveMessage:(NSNotification *)noti
{
    self.ZFLabel.text = noti.userInfo[@"key"];
}

TwoViewController控制器:

-(void)ZFBtnAction
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notiTransmitValue" object:nil userInfo:@{@"key":@"我是通知传值"}];

    [self dismissViewControllerAnimated:YES completion:^{

    }];
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值