ios 页面传值

今天看了一下ios 页面传值的方式大致分为四种:

  • 代理delegate
  • block
  • 通知
  • 单例class

今天试了一下前三种,在这里记录一下


下面示例是有两个页面,每个页面都有一个按钮Button,点击第一个页面的按钮回调到第二个页面,再点击第二个页面回跳转道第一个页面,第一个按钮的标题变为第二个按钮传回的值。


代理delegate

代理似乎是我的心结,能用API 但是就是不会自己写,这也是今天会写传值的原因。

假设两个页面传值,协议类应该写在哪,代理应该定义在那个页面?

总结的时候我觉得可以这样来想:第二个页面想要修改第一个页面的值,但是他没办法做到,所以他需要一个代理来帮助它修改,所以代理需要定义在第二个页面。第一个页面需要支持代理



第一个页面:

@interface frontVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *frontBtn;

@end

#import "frontVC.h"

@interface frontVC ()
{
    realendVC *realendvc;//第二个页面
}

@end

@implementation frontVC

- (void)viewDidLoad {
    [super viewDidLoad];
    //从storyboard中获得第二个页面
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    realendvc = [storyboard instantiateViewControllerWithIdentifier:@"second"];
    //设置代理
    realendvc.delegate = self;
}

//按钮点击事件
- (IBAction)click:(id)sender {
    [self.navigationController pushViewController:realendvc animated:YES];
}

//代理方法
- (void)changebutton:(NSString *)string
{
    [_frontBtn setTitle:string forState:UIControlStateNormal];
}

@end

第二个页面:

@protocol change 

- (void) changebutton:(NSString *)string;

@end


@interface realendVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *realendBtn;

@property (nonatomic,weak) id delegate;


@end

#import "realendVC.h"

@interface realendVC ()

@end

@implementation realendVC

- (void)viewDidLoad {
    [super viewDidLoad];
}


- (IBAction)click:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
    if (self.delegate) {
        [self.delegate changebutton:@"成功"];
    }
}

@end

block

第一个页面

#import 
#import "realendVC.h"


@interface frontVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *frontBtn;

@end

#import "frontVC.h"

@interface frontVC ()
{
    realendVC *realendvc;//第二个页面
}

@end

@implementation frontVC

- (void)viewDidLoad {
    [super viewDidLoad];
    //从storyboard中获得第二个页面
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    realendvc = [storyboard instantiateViewControllerWithIdentifier:@"second"];
    
    //在block中允许访问变量,但不允许修改,需要加上下面一句代码
    __block UIButton * button = _frontBtn;
    realendvc.myblock = ^(NSString *string)
    {
        [button setTitle:string forState:UIControlStateNormal];
    };
}

//按钮点击事件
- (IBAction)click:(id)sender {
    [self.navigationController pushViewController:realendvc animated:YES];
}


@end

第二个页面

#import 

typedef void(^Myblock) (NSString *);
@interface realendVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *realendBtn;

@property (copy,nonatomic) Myblock myblock;


@end

#import "realendVC.h"

@interface realendVC ()

@end

@implementation realendVC

- (void)viewDidLoad {
    [super viewDidLoad];
}


- (IBAction)click:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
    self.myblock(@"成功");
}

@end

通知

第一个页面

#import 
#import "realendVC.h"


@interface frontVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *frontBtn;

@end

#import "frontVC.h"

@interface frontVC ()
{
    realendVC *realendvc;//第二个页面
}

@end

@implementation frontVC

- (void)viewDidLoad {
    [super viewDidLoad];
    //从storyboard中获得第二个页面
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    realendvc = [storyboard instantiateViewControllerWithIdentifier:@"second"];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(change:) name:@"button"object:nil];
    
    
   
}
//通知调用事件
- (void)change:(NSNotification *)notification
{
    [_frontBtn setTitle:(NSString *)[notification object] forState:UIControlStateNormal];
}

//按钮点击事件
- (IBAction)click:(id)sender {
    [self.navigationController pushViewController:realendvc animated:YES];
}


@end

第二个页面

#import 

@interface realendVC : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *realendBtn;



@end

#import "realendVC.h"

@interface realendVC ()

@end

@implementation realendVC

- (void)viewDidLoad {
    [super viewDidLoad];
}


- (IBAction)click:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"button" object:@"成功"];
}

@end

感谢各博主大神。

你可能感兴趣的:(iOS)