iOS 常用傳值方式

總結(jié) iOS 日常開發(fā)中的幾種常用傳值方式:

  1. 正向傳值
  2. 代理傳值
  3. block傳值
  4. 通知傳值
  5. 單例

文章代碼:https://github.com/BWLi420/BWTransferValueDemo


1. 正向傳值

  • 使用場(chǎng)景:界面 A 跳轉(zhuǎn)界面 B 的同時(shí)褂痰,向界面 B 傳遞值憔鬼,即上級(jí)向下級(jí)傳遞
  • 步驟:
    1. 在界面 B 的 .h 文件中公開聲明一個(gè)屬性

      @interface ViewC1 : UIViewController
      
      //正向傳值 1
      @property (nonatomic, copy) NSString *value_1;
      
      @end
      
    2. 導(dǎo)入界面 B 的頭文件犹撒,并使用 B 創(chuàng)建出一個(gè)對(duì)象,對(duì)屬性進(jìn)行賦值

      ViewC1 *VC1 = [[ViewC1 alloc] init];
      VC1.value_1 = @"我是正向傳值";
      [self.navigationController pushViewController:VC1 animated:YES];
      

2. 代理傳值

  • 使用場(chǎng)景:界面 A 跳轉(zhuǎn)界面 B ,界面 B 返回界面 A 時(shí)傳結(jié)果給 A,即下級(jí)向上級(jí)傳遞
  • 步驟:
    1. 在界面 B 頭文件中定義協(xié)議

      @protocol ViewC2Delegate <NSObject>
      
      - (void)changeMainVCBackgroundColor:(UIColor *)color;
      @end
      
    2. 在界面 B 頭文件中定義代理屬性

      @interface ViewC2 : UIViewController
      
      @property (nonatomic, weak) id<ViewC2Delegate> delegate;
      @end
      
    3. 在界面 B 的 .m 中合適位置調(diào)用代理方法

      // 3.調(diào)用代理方法 <需先進(jìn)行檢測(cè)>
      if ([self.delegate respondsToSelector:@selector(changeMainVCBackgroundColor:)]) {
          [self.delegate changeMainVCBackgroundColor:[UIColor greenColor]];
      }
      
    4. 在界面 A 中設(shè)置代理

    5. 在界面 A 中遵守協(xié)議

      @interface ViewController ()<ViewC2Delegate>
      @end
      
      ViewC2 *VC2 = [[ViewC2 alloc] init];
      VC2.delegate = self;
      [self.navigationController pushViewController:VC2 animated:YES];
      
    6. 實(shí)現(xiàn)代理協(xié)議中的方法

      - (void)changeMainVCBackgroundColor:(UIColor *)color {
          
          self.view.backgroundColor = color;
      }
      

3. block傳值

  • 使用場(chǎng)景:類似代理,當(dāng)協(xié)議中的方法只有一個(gè)倒源,可以使用 block,此時(shí)可以不用寫協(xié)議纪铺,相當(dāng)于簡化的代理
  • 步驟:
    1. 在發(fā)送者頭文件中定義 block 屬性

      @interface ViewC3 : UIViewController
      
      @property (nonatomic, copy) void (^changeMainVCBgColor)(UIColor *color);
      
      @end
      
    2. 在發(fā)送者 .m 文件合適位置調(diào)用 block

      //調(diào)用block
      if (self.changeMainVCBgColor) {
          self.changeMainVCBgColor([UIColor redColor]);
      }
      
    3. 在接收者中實(shí)現(xiàn)具體操作

      ViewC3 *VC3 = [[ViewC3 alloc] init];
      VC3.changeMainVCBgColor = ^(UIColor *color) {
          self.view.backgroundColor = color;
      };
      [self.navigationController pushViewController:VC3 animated:YES];
      

4. 通知傳值

  • 使用場(chǎng)景:代理一般適用于上下級(jí)之間相速,若是多級(jí)結(jié)構(gòu)時(shí)會(huì)相當(dāng)麻煩,使用通知沒有級(jí)別結(jié)構(gòu)限制
  • 步驟:
    1. 在發(fā)送者中發(fā)布通知

      //1.發(fā)布通知
      NSDictionary *dict = @{@"color":[UIColor grayColor]};
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeMainBgColor" object:@"VC42" userInfo:dict];
      
    2. 在接收者中注冊(cè)通知

      //2.一般在 viewDidLoad 中注冊(cè)通知
      //通知名稱需一致
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColor:) name:@"viewDidLoad" object:@"VC42"];
      
    3. 在接收者中實(shí)現(xiàn)通知具體操作

      - (void)changeColor:(NSNotification *)noti {
          
          NSDictionary *dict = noti.userInfo;
          self.view.backgroundColor = [dict valueForKeyPath:@"color"];
      }
      
    4. 在接收者中注銷通知

      - (void)dealloc {
          
          [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ChangeMainBgColor" object:@"VC42"];
      }
      

5. 單例傳值

  • 使用場(chǎng)景:多次創(chuàng)建僅有唯一一個(gè)鲜锚,隨用隨取
  • 步驟:
    1. 創(chuàng)建單例類突诬,聲明需要傳遞的屬性

      @interface Person : NSObject
      
      interfaceSingleton(PersonName);
      
      @property (nonatomic, copy) NSString *name;
      
      @end
      
    2. 實(shí)例化一個(gè)對(duì)象,對(duì)對(duì)象的屬性進(jìn)行賦值

      Person *person = [[Person alloc] init];
      person.name = @"單例賦值的名字";
      
    3. 在需要用到的地方實(shí)例化一個(gè)對(duì)象芜繁,取出屬性值

      Person *person = [[Person alloc] init];
      NSLog(@"取出單例賦值:%@", person.name);
      

      PS: 創(chuàng)建單例類請(qǐng)查看我之前的文章《iOS 單例模式簡析》


個(gè)人博客:https://mortal-master.github.io

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旺隙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骏令,更是在濱河造成了極大的恐慌蔬捷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榔袋,死亡現(xiàn)場(chǎng)離奇詭異周拐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凰兑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門妥粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吏够,你說我怎么就攤上這事勾给。” “怎么了锅知?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵播急,是天一觀的道長。 經(jīng)常有香客問我售睹,道長桩警,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任昌妹,我火速辦了婚禮生真,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捺宗。我一直安慰自己柱蟀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布蚜厉。 她就那樣靜靜地躺著长已,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上术瓮,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天康聂,我揣著相機(jī)與錄音,去河邊找鬼胞四。 笑死恬汁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辜伟。 我是一名探鬼主播氓侧,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼导狡!你這毒婦竟也來了约巷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤旱捧,失蹤者是張志新(化名)和其女友劉穎独郎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枚赡,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氓癌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贫橙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贪婉。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖料皇,靈堂內(nèi)的尸體忽然破棺而出谓松,到底是詐尸還是另有隱情星压,我是刑警寧澤践剂,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站娜膘,受9級(jí)特大地震影響逊脯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竣贪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一军洼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧演怎,春花似錦匕争、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春跑杭,著一層夾襖步出監(jiān)牢的瞬間铆帽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工德谅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爹橱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓窄做,卻偏偏與公主長得像愧驱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浸策,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容