你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios 頁面傳值

ios 頁面傳值

編輯:IOS開發綜合

今天看了一下ios 頁面傳值的方式大致分為四種:

代理delegateblock通知單例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:@buttonobject: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

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved