幾種傳值方式

1. 屬性傳值

通常用于正向傳值,適用于A和B相互具有一定關(guān)聯(lián)性。不能用于隔頁面?zhèn)髦?。而且,需要傳值的屬性不能是私有屬性,也就是說在.h中聲明出來的屬性才可以傳值。

UIViewController *B = [UIViewController new];

B.title = @"B的標(biāo)題";

[A.navigationController pushViewController:B animated:YES];
2. Block傳值

使用場景:
常用于回調(diào),簡單的說就是B有一個(gè)按鈕,當(dāng)按鈕被點(diǎn)擊時(shí)把點(diǎn)擊事件傳傳給A,并傳一個(gè)字符串"B被點(diǎn)了"。

//首先在B控制器中聲明一個(gè)block,參數(shù)是一個(gè)字符串
@property (nonatomic,copy) void(^block)(NSString *title);

//同樣在B控制器,在按鈕點(diǎn)擊觸發(fā)的方法里執(zhí)行block
- (void)buttonClick:(UIButton *)sender
{
   self.block(@"B被點(diǎn)了");
}

//現(xiàn)在回到A控制器,在推出B的時(shí)候給B的block賦值,簡單的說,就是在收到B的消息時(shí),想要做什么事
BController *B = [BController new];

   B.block = ^(NSString *title) {

       //do someThing
       A.title = title;

   };
[A.navigationController pushViewController:B animated:YES];

同樣的Block在這里作為屬性存在,同屬性傳值一樣,需要兩個(gè)控制器間具有一定關(guān)聯(lián)性。不能跨頁面?zhèn)髦怠?br> 如果一定要跨,就要像接力賽一樣,A傳給B,B傳給C這樣

3. 代理傳值

代理傳值和block傳值相似,都是將事件分發(fā)出去。但是與block的不同在于,代理具有松耦合性,誰想處理事件成為代理即可。

//首先,在B里定義個(gè)協(xié)議并聲明一個(gè)代理
@protocol B_ButtonClickDelegate <NSObject>

- (void)B_ButtonIsClicked:(NSString *)message;

@end

@interface BController : UIViewController

@property (nonatomic,assign) id<B_ButtonClickDelegate>delegate;

@end

//B控制器,點(diǎn)擊事件發(fā)生時(shí)讓代理去執(zhí)行代理方法
- (void)buttonClick:(UIButton *)sender
{
    [self.delegate B_ButtonIsClicked:@"B的按鈕被點(diǎn)了誰來管管"];
}

//推出B之前,讓A成為B的代理
BController *B = [BController new];

B.delegate = A;

[A.navigationController pushViewController:B animated:YES];

//最后A遵守協(xié)議并實(shí)現(xiàn)對(duì)應(yīng)代理方法
@interface AController ()<B_ButtonClickDelegate>

- (void)B_ButtonIsClicked:(NSString *)message
{
    self.title = message;
}
4. 通知中心傳值

上面說的代理屬于一對(duì)一的關(guān)系,就好像一夫一妻制。你有需求只能找你的代理(你老婆)。而通知中心屬于一對(duì)多的,就像村頭的喇叭一喊,全村人都能聽到。
而在實(shí)際開發(fā)中,常見用到的通知地方就是更換主題。在某個(gè)控制器發(fā)生事件,其他已存在的控制器作出響應(yīng)。這里注意一點(diǎn),是已存在。

//在需要處理事件的控制器的初始化方法里訂閱通知,注意,一定是先訂閱
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealAction:) name:@"B的按鈕被點(diǎn)了大家響應(yīng)下" object:nil];

//收到通知后執(zhí)行什么事?實(shí)現(xiàn)**dealAction:**即可
- (void)dealAction:(NSNotification *)sender
{
    //這里的object就是發(fā)出通知時(shí)附帶
    NSLog(@"%@",sender.object);
    //打印結(jié)果--"哈薩克"
}

//在B控制器需要處理事件的時(shí)候發(fā)出通知
- (void)buttonClick:(UIButton *)sender
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"B的按鈕被點(diǎn)了大家響應(yīng)下" object:@[@"哈薩克"]];
}
5. 單例傳值

iOS系統(tǒng)中常間的單例模式莫過于UIApplication、 NSNotificationCenter、 NSUserDefaults
如何創(chuàng)建單例這里不做說明,以NSUserDefaults為例說下具體使用

//以鍵值對(duì)的形式存值到NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:@"哈薩克" forKey:@"亞索"];

//從NSUserDefaults取出
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"亞索"];

NSLog(@"%@",value); //打印結(jié)果--"哈薩克"
6. 全局變量傳值

在某個(gè)文件的.m文件創(chuàng)建一個(gè)全局變量,其他文件只要引用該變量,即可對(duì)該變量值進(jìn)行修改和使用。需要注意,變量名要保證全局唯一。

//創(chuàng)建全局變量
NSString *message;

@implementation AController

//引用全局變量
extern NSString *message;

@implementation BController

//使用和修改
extern NSString *message;

@implementation BController

- (void)buttonClick:(UIButton *)sender
{
    self.title = message;

    message = @"我愛你中國";
}
7. 數(shù)據(jù)庫傳值

數(shù)據(jù)庫無非在于打開數(shù)據(jù)庫、建表以及基于數(shù)據(jù)庫表的增刪改查操作
這里有一個(gè)唐巧大大的FMDB的demo自行學(xué)習(xí)吧demo點(diǎn)這里

8. NSFileManager

跟數(shù)據(jù)庫類似,只是將數(shù)據(jù)寫成文件保存在沙盒中。
需要注意的:
1.文件路徑是否正確
2.不能保存復(fù)雜對(duì)象
點(diǎn)這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.屬性傳值 通常用于正向傳值,適用于A和B相互具有一定關(guān)聯(lián)性。不能用于隔頁面?zhèn)髦?。而且,需要傳值的屬性不能是私?..
    yzhxcql閱讀 9,228評(píng)論 21 96
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,423評(píng)論 6 13
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評(píng)論 30 472
  • (一)屬性傳值: 屬性傳值是最簡單,也是最常見的一種傳值方式,但只能正向傳值(將第一個(gè)頁面的值傳遞到第二個(gè)頁面,但...
    yymyb閱讀 1,746評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139

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