iOS 轉(zhuǎn)場(chǎng)時(shí) appear 與 disappear 的調(diào)用順序探索

原文地址 Cyrus' blog

最近幾天看了好多人的面經(jīng),時(shí)不時(shí)就看到一個(gè)問題:

在A頁面跳轉(zhuǎn)到B頁面的過程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 誰先調(diào)用?

其實(shí)我以前一直理所當(dāng)然的認(rèn)為它們的順序就是 A-viewDidDisappear --> B-viewDidAppear,至于為什么會(huì)這么想,就是感覺

今天寫了個(gè)Demo去測(cè)試了一下,發(fā)現(xiàn)完全不是自己想象的那樣,每一種轉(zhuǎn)場(chǎng)(Push,Present,TabBar切換)都是不一樣的。

Demo 地址 Appear&Disappear-Sample

測(cè)試


我自定義了兩個(gè)類,繼承自UIViewController,為了方便觀察分別叫做A_ViewController,B_ViewController,然后重寫了一系列 appeardisappear 方法。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"A  view will appear    %@",self);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"A  view did  appear    %@",self);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"A  view will disappear %@",self);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear: animated];
    NSLog(@"A  view did  disappear %@",self);
}

然后分別用 push, present, 以及 tabbar 的切換來測(cè)試,然后查看打印的結(jié)果。

Push & Pop


--------------------------PUSH-----------------------------

 A  view will disappear <A_ViewController: 0x7fa11067a730>
 B  view will appear    <B_ViewController: 0x7fa110516530>
 A  view did  disappear <A_ViewController: 0x7fa11067a730>
 B  view did  appear    <B_ViewController: 0x7fa110516530>

--------------------------POP-----------------------------

 B  view will disappear <B_ViewController: 0x7fa110516530>
 A  view will appear    <A_ViewController: 0x7fa11067a730>
 B  view did  disappear <B_ViewController: 0x7fa110516530>
 A  view did  appear    <A_ViewController: 0x7fa11067a730>
 

在這里的調(diào)用順序是和我之前預(yù)想的一樣的,也就是

A-willDisappear --> B-willAppear --> A-didDisappear --> B-didAppear

Present & Dismiss


在模態(tài)的轉(zhuǎn)場(chǎng)中就有一些不一樣的事了。我們知道模態(tài)轉(zhuǎn)場(chǎng)有好多種style,其中有兩種我們需要特別注意的UIModalPresentationCustom,UIModalPresentationOverFullScreen。我們先看一下除了這兩種style以外的轉(zhuǎn)場(chǎng),他們的調(diào)用順序是怎樣的。

-----------------------NormalPresent------------------------

 A  view will disappear <A_ViewController: 0x7fc2a14ac490>
 B  view will appear    <B_ViewController: 0x7fc2a152a880>
 B  view did  appear    <B_ViewController: 0x7fc2a152a880>
 A  view did  disappear <A_ViewController: 0x7fc2a14ac490>

-------------------------DISMISS----------------------------

 B  view will disappear <B_ViewController: 0x7fc2a152a880>
 A  view will appear    <A_ViewController: 0x7fc2a14ac490>
 A  view did  appear    <A_ViewController: 0x7fc2a14ac490>
 B  view did  disappear <B_ViewController: 0x7fc2a152a880>

這里其實(shí)已經(jīng)和push的轉(zhuǎn)場(chǎng)不一樣了。普通模態(tài)的轉(zhuǎn)場(chǎng)的順序是這樣的

A-willDisappear --> B-willAppear --> B-didAppear --> A-didDisappear

再看看前面提到的那兩種特殊的模態(tài)轉(zhuǎn)場(chǎng)。因?yàn)樵谶@兩種方式的轉(zhuǎn)場(chǎng)下A的view是不會(huì)消失的,所以所有與A有關(guān)的 appear 或 disappear 方法都不會(huì)被調(diào)用

-----------------------CustomPresent------------------------

 B  view will appear    <B_ViewController: 0x7f960249bac0>
 B  view did  appear    <B_ViewController: 0x7f960249bac0>

-------------------------DISMISS----------------------------

 B  view will disappear <B_ViewController: 0x7f960249bac0>
 B  view did  disappear <B_ViewController: 0x7f960249bac0>

所以在這兩種style下只有B-willAppear --> B-didAppear

TabBar切換


TabBar 的切換也是一個(gè)很神奇的順序

 B  view will appear    <B_ViewController: 0x7f88cbed7160>
 A  view will disappear <A_ViewController: 0x7f88cbed6680>
 A  view did  disappear <A_ViewController: 0x7f88cbed6680>
 B  view did  appear    <B_ViewController: 0x7f88cbed7160>

與push不同的是,TabBar下,會(huì)先調(diào)用 B 的 willAppear,再調(diào)用 A 的 willDisappear

所以TabBar的順序是這樣的:

B-willAppear --> A-willDisappear --> A-didDisappear --> B-didAppear

總結(jié)


在每一種轉(zhuǎn)場(chǎng)下,appear 與 disappear 都有一些不一樣的順序,一定要分清楚,不能一概而論。

Push: A-willDisappear-->B-willAppear-->A-didDisappear-->B-didAppear

Present: A-willDisappear-->B-willAppear-->B-didAppear-->A-didDisappear

CustomPresent: B-willAppear-->B-didAppear

TabBar: B-willAppear-->A-willDisappear-->A-didDisappear-->B-didAppear

疑惑


為什么要把這個(gè)過程弄的這么復(fù)雜?目前還沒有想法,如果有知道的朋友,希望告知。
最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前言的前言 唐巧前輩在微信公眾號(hào)「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各項(xiàng)指標(biāo)...
    VincentHK閱讀 5,580評(píng)論 3 44
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,427評(píng)論 4 61
  • 本來以為公司的培訓(xùn)已經(jīng)做的很完美了,看過了市面上的很多課然后加入這個(gè)團(tuán)隊(duì),我才發(fā)現(xiàn)好多做法還停留在10年前。作為學(xué)...
    微景洞天閱讀 392評(píng)論 0 0
  • 在去年的WWDC上蘋果官方說Xcode7后開發(fā)者可以免證書真機(jī)調(diào)試了,除要上架時(shí)也算省了99刀啦何樂不為。 現(xiàn)在的...
    IronMing閱讀 4,357評(píng)論 8 4

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