在進(jìn)行頁面跳轉(zhuǎn)時随静,往往都需要攜帶數(shù)據(jù)燎猛,以便于對界面進(jìn)行數(shù)據(jù)的初始化,方便用戶查看一些信息重绷、狀態(tài)等昭卓,以下是本人在開發(fā)時總結(jié)的界面?zhèn)髦档膸追N方式:
一、屬性傳值
屬性傳值即在頁面進(jìn)行跳轉(zhuǎn)時能颁,直接給將要跳轉(zhuǎn)的頁面中的指定屬性進(jìn)行賦值操作伙菊,我們以頁面一跳轉(zhuǎn)到頁面二為例,頁面一僅有一個跳轉(zhuǎn)按鈕昌简,跳轉(zhuǎn)代碼如下:
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.str = @"這是頁面一給我設(shè)置的";
[self presentViewController:secondVC animated:YES completion:nil];
}
從代碼可看出纯赎,在跳轉(zhuǎn)到SecondViewController之前南蹂,我們先給secondVC對象中的str屬性賦值了,那么在secondVC界面初始化時,即可去讀取并顯示str中的數(shù)據(jù)了,以下是頁面二的部分代碼峰伙,在跳轉(zhuǎn)前瞳氓,給頁面二指定的屬性賦值即可栓袖;
@interface SecondViewController : UIViewController
@property (strong,nonatomic) NSString *str;
@end
二、單例傳值???
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 通過單例對象來傳遞數(shù)據(jù),首先創(chuàng)建一個單例類裹刮,并在其中定義并實現(xiàn)靜態(tài)的單例構(gòu)造方法,獲取唯一的單例對象,同時在單例類中添加指定的屬性违霞,SingleInstance.h代碼如下:
@interface SingleInstance : NSObject
@property (strong,nonatomic) NSString *singleStr;
+(instancetype)sharedInstance;
@end
以下是SingleInstance.m代碼
@implementation SingleInstance
//通過類方法創(chuàng)建單例對象
+(instancetype)sharedInstance
{static SingleInstance *instance = nil;
??? if (instance == nil) {
????? instance = [[SingleInstance alloc] init];
???? }return instance;}
@end
單例類創(chuàng)建完成后葛家,在進(jìn)行頁面跳轉(zhuǎn)前,對單例對象中的指定屬性進(jìn)行賦值底燎,然后在跳轉(zhuǎn)后的頁面中再讀取單例對象中指定的屬性值双仍,代碼如下:
-(void)doJump
{
??? SecondViewController *secondVC = [[SecondViewController alloc] init];
??? [SingleInstance sharedInstance].singleStr = @"這是單例傳值";
??? [self presentViewController:secondVC animated:YES completion:nil];
}
三桌吃、NSUserDefaults傳值
NSUserDefaluts是系統(tǒng)提供的一種方法,在頁面一中先傳入數(shù)據(jù)到程序的沙盒當(dāng)中逗物,然后在頁面二中再從沙盒中讀取數(shù)據(jù)翎卓,代碼如下:
頁面一:[[NSUserDefaults standardUserDefaults] setObject:@"這是NSUserDefaults傳值" forKey:@"NSDefaults"];
通過鍵值對的方式存儲數(shù)據(jù)摆寄,再在頁面二中通過key值讀取指定的數(shù)據(jù)
頁面二:_label.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"NSDefaults"];
四坯门、block傳值
block傳值主要用于頁面二給頁面一回傳數(shù)據(jù),即進(jìn)行頁面的反向傳值古戴,首先需要在頁面二中添加block屬性,我們以傳遞NSString為例现恼,代碼如下:
//定義一個block述暂,進(jìn)行頁面反向傳值
@property (copy) void (^block)(NSString *);
其次在頁面二返回到頁面一時畦韭,給這個block進(jìn)行傳參肛跌,代碼如下:
-(void)doClick
{
??? //block傳值衍慎,反向傳值
??? self.block(@"block傳值啦");
??? [self dismissViewControllerAnimated:YES completion:nil];
}
在頁面一中,我們需要實現(xiàn)頁面二中的block屬性進(jìn)行讀取數(shù)據(jù)的操作赠法,代碼如下:
-(void)doJump
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
//block傳值砖织,實現(xiàn)block末荐,接收來自頁面二的值
secondVC.block = ^(NSString *str){
self.label.text = str;
};
[self presentViewController:secondVC animated:YES completion:nil];
}
五甲脏、代理傳值
通過代理傳值,實現(xiàn)頁面二反向傳遞數(shù)據(jù)給頁面一娜氏,實現(xiàn)步驟如下:
?a.委托方(頁面二)持有協(xié)議并調(diào)用協(xié)議方法贸弥,代碼如下:
#import <UIKit/UIKit.h>
//委托方創(chuàng)建一個協(xié)議
@protocol sendDataDelegate <NSObject>
//協(xié)議定義一個傳值的方法
-(void)sendData:(NSString *)str;
@end
@interface SecondViewController : UIViewController
//定義一個持有協(xié)議的ID指針
@property (weak)id<sendDataDelegate> delegate;
@end
b.委托方(頁面二)在跳轉(zhuǎn)至代理方(頁面一)時調(diào)用協(xié)議方法
-(void)doClick
{
??? //代理傳值茂腥,反向傳值
??? [self.delegate sendData:@"代理傳值啦"];
??? [self dismissViewControllerAnimated:YES completion:nil];
}
c.代理方(頁面一)遵守協(xié)議并實現(xiàn)協(xié)議的方法
@interface ViewController ()<sendDataDelegate>
@end
@implementation ViewController
//代理傳值最岗,實現(xiàn)協(xié)議方法朝捆,接收頁面二傳遞的值,sendData為sendDataDelegate協(xié)議中的方法
-(void)sendData:(NSString *)str
{
self.label.text = str;
}
......
@end
d.設(shè)置委托方(頁面二)的代理為代理方(頁面一)
-(void)doJump
{
??? SecondViewController *secondVC = [[SecondViewController alloc] init];
??? //設(shè)置代理為頁面一
??? secondVC.delegate = self;
??? [self presentViewController:secondVC animated:YES completion:nil];
}
以上是自己總結(jié)的一些關(guān)于IOS頁面?zhèn)髦档姆绞杰脚蹋缬衅渌玫姆绞饺謇希瑲g迎提出,謝謝