幾種常用的頁面通信方式

屬性傳值:從前往后傳值
步驟 :
在第二個頁面, 接口文件里, 聲明一個NSString類型的屬性, 用來做存放傳遞的中間結(jié)果 nsstring T
在第一個頁面, 實現(xiàn)頁面跳轉(zhuǎn)的方法里, 將要傳遞的值賦值給第二個頁面的中間變量 T = one.text
在第二個頁面, 將本頁面中控件的值賦值為中間變量 two.text = T

代理傳值:從后往前傳值
步驟:
在第二個頁面中, 聲明'協(xié)議
在第二個頁面中, 聲明協(xié)議方法(帶參數(shù))
在第二個頁面中, 聲明設(shè)置代理的方法(setter方法)
在第二個頁面的跳轉(zhuǎn)頁面的方法中, 指定代理實現(xiàn)代理方法(帶參數(shù))
在第一個頁面 , 遵循協(xié)議
在第一個頁面的跳轉(zhuǎn)頁面中, 設(shè)置代理人
在第一個頁面中, 實現(xiàn)代理方法

block傳值: 從后往前傳值
步驟:
在第二個頁面中, 重命名一個block塊(有參數(shù))
在第二個頁面中, 定義一個上面聲明的block塊的 block
在第二個頁面中, 實現(xiàn)跳轉(zhuǎn)的方法中(即: 跳轉(zhuǎn)頁面之前), 調(diào)用block(帶有實參)
在第一個頁面中, 實現(xiàn)跳轉(zhuǎn)的方法中(即: 有第二個頁面類的對象), 用第二個類的對象.block ,在block方法中實現(xiàn)賦值(形參)

三種頁面?zhèn)髦祵嵗菔?1.屬性傳值:從前往后傳值
描述: 這里新建兩個頁面, RootViewController 和 SecondViewController ,我們要實現(xiàn)將第一個頁面上的值,傳遞到第二個頁面的效果
第一步:  在SecondViewController.h 文件中 聲明一個屬性
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//聲明中間變量
@property (nonatomic, retain)NSString *textString;
@end

第二步: 在RootViewController文件中, 給上面定義的中間變量賦值
這里將賦值放到了實現(xiàn)頁面跳轉(zhuǎn)的方法中, 是因為用引用第二個頁面,而此方法中已經(jīng)聲明了一個對象(即:secondVC)
- (void)nextPage:(UINavigationItem *)next{
    SecondViewController *secondVC = [SecondViewController new];
    //給中間變量賦值
    secondVC.textString = self.rightText.text;
    [self.navigationController pushViewController:secondVC animated:YES];
 }

//第三步: 在SecondViewController.m文件中, 實現(xiàn)傳值—>賦值過程

  self.rightText.text = self.textString;
______________________________________________________________________________________________________
2 .代理傳值:從后往前傳值
描述: 這里新建兩個頁面, RootViewController 和 SecondViewController ,我們要實現(xiàn)將第二個頁面上的值,傳遞到第一個頁面的效果
第一步:  在SecondViewController.h頁面聲明代理協(xié)議 , 代理方法,  及指定代理人的屬性
#import <UIKit/UIKit.h>

//第一步 聲明協(xié)議
@protocol secondDelegate<NSObject>
//第二步 聲明代理方法
- (void)changeValue:(NSString *)value;
@end

@interface SecondViewController : UIViewController
//第三步 設(shè)置代理方法
@property (nonatomic, weak)id<secondDelegate>delegate;
@end

第二步:在SecondViewController.m文件里, 調(diào)用代理方法
這里代理方法的執(zhí)行位置,可以任意!!
- (void)backAC:(UINavigationItem *)back{   
//第四步 執(zhí)行代理方法
    [self.delegate changeValue:self.rightText.text];    [self.navigationController popViewControllerAnimated:YES];   
}

第三步: 在RootViewController.m文件中遵循協(xié)議
//第五步 遵循協(xié)議
@interface RootViewController ()<secondDelegate>

第四步: 在RootViewController.m文件中
跳轉(zhuǎn)方法中實現(xiàn)
- (void)nextPage:(UINavigationItem *)next{

    SecondViewController *secondVC = [SecondViewController new]; 
  //第六步 指定代理人
    secondVC.delegate = self;   
    [self.navigationController pushViewController:secondVC animated:YES]; 
}

第五步: 在RootViewController.m文件中
第七步 實現(xiàn)協(xié)議方法
- (void)changeValue:(NSString *)value{     
  //將協(xié)議中傳過來的值, 賦值給當前的label  
  self.leftLabel.text = value;   
}

3 .block傳值:從后往前傳值
描述: 這里新建兩個頁面, RootViewController 和FirstViewController ,我們要實現(xiàn)將第二個頁面上的值,傳遞到第一個頁面的效果
第一步:  在FirstViewController.h重命名一個block
#import <UIKit/UIKit.h>

第一步 : 聲明block方法
typedef void(^changeValueBlock)(NSString *string);
@interface FirstViewController : UIViewController
第二步 : 聲明block屬性
//copy : 從棧區(qū)copy到堆區(qū)來使用
@property (nonatomic, copy)changeValueBlock block;
@end

第二步:  在FirstViewController.m文件中的跳轉(zhuǎn)方法內(nèi), 調(diào)用該block并傳值
- (void)backAction:(UIButton *)back{   
第三步 : 將要傳遞的內(nèi)容, 作為block的參數(shù)
    self.block(self.textField.text);

    [self.navigationController popViewControllerAnimated:YES];
}
第三步:  在RootViewController.m文件中的跳轉(zhuǎn)方法內(nèi), 調(diào)用該block并接收值
- (void)nextAC:(UIButton *)next{      
 FirstViewController *firstVC = [FirstViewController new];
第四步 : 實現(xiàn)傳值(接收傳遞過來的內(nèi)容)
    __weak RootViewController *rootVC = self;   
 firstVC.block = ^(NSString *string){              
 rootVC.textLabel.text = string;    };      
 [self.navigationController pushViewController:firstVC animated:YES];   
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容