addChildViewController注解

幾年前就從網(wǎng)上抄襲過addChildViewController的用法,但沒花過心思去理解它。而且锨用,很多抄襲來的代碼耸峭,無法理解為什么要那么寫!(因為有些本來就寫得爛蝉稳,也誤導了自己..)
今天又重新搞了一遍抒蚜,(以前很少用,所以耦合度有點高..)耘戚,參考其官方注釋和其他人的代碼嗡髓。
先看幾個屬性、方法:
\color{red}{************************************************************}

  • 子控制器數(shù)組收津,不包含任何當前展示的子控制器
open var childViewControllers: [UIViewController] { get }

\color{red}{************************************************************}

  • 如果該子控制器有另一個父控制器饿这,會先通過執(zhí)行removeFromParentViewController方法把該子控制器
    從其當前父控制器移除。如果重載該方法朋截,必須調(diào)用super方法蛹稍。
open func addChildViewController(_ childController: UIViewController)

\color{red}{************************************************************}

  • 把自身從父控制器的childViewControllers數(shù)組中移除。如果重載部服,必須調(diào)用super方法唆姐。
open func removeFromParentViewController()

\color{red}{************************************************************}

  • 該方法可用于切換兄弟控制器。方法調(diào)用者是它們共同的父控制器廓八。(用 [UIViewController addChildViewController:] 建立父子關(guān)系)
    該方法將把【‘toViewController’的view】添加到【‘fromViewController’的view的父視圖view】上奉芦;
    當切換完成后赵抢,【‘fromViewController’的view】將從其父視圖上移除。声功,...烦却,
    該方法調(diào)用者不能是iOS容器類控制器及其子類(tabbar,navigation controller等)...。
open func transition(from fromViewController: UIViewController, to toViewController: UIViewController, 
duration: TimeInterval, options: UIViewAnimationOptions = [], 
animations: (() -> Swift.Void)?, 
completion: ((Bool) -> Swift.Void)? = nil)

\color{red}{************************************************************}

根據(jù)這幾個方法說明先巴,我認為其爵,childViewControllers是配合addChildViewController一起用的,當然
內(nèi)部肯定還有remove相關(guān)的操作伸蚯,暫時不用關(guān)心摩渺。addChildViewController沒有任何特別的操作,就是往數(shù)組里添加元素剂邮,以此來確認雙方父子關(guān)系摇幻。父控制器則通過childViewControllers辨認哪些是自己的兒子,兒子們相互間就是兄弟挥萌。
關(guān)鍵方法transition(from,to,duration,options,animations,completion)則是用于兄弟控制器的切換绰姻。有些人在每次調(diào)用切換方法之前,還調(diào)用addChildViewController引瀑,完了還調(diào)用removeFromParentViewController狂芋。純粹是脫褲子放屁!完全沒必要伤疙,因為transition方法并不會移除子控制器银酗。

所以正確的寫法應(yīng)該是:

  • 在父控制器中:

1.添加子控制器

func addChildVCs() {
        //直接導致firstVC執(zhí)行willMove(toParentViewController parent: UIViewController?)
        self.addChildViewController(firstVC)      
        //直接導致secondVC執(zhí)行willMove(toParentViewController parent: UIViewController?)     
        self.addChildViewController(secondVC)    
        
        firstVC.view.frame = self.view.bounds
        self.view.addSubview(firstVC.view)
        firstVC.didMove(toParentViewController: self)    //手動調(diào)用
        currentVC = localPackageVC
    }

2.子控制器間的切換(不需要再寫addChildViewController!也不要寫oldVC.removeFromParentViewController())

func changeControllerFrom(oldVC: UIViewController, to newVC: UIViewController) {

       //oldVC.willMove(toParentViewController: nil)       //手動調(diào)用
       //newVC.willMove(toParentViewController: self)      //手動調(diào)用

        newVC.view.frame = self.view.bounds
        self.transition(from: oldVC, to: newVC, duration: 0.5, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {}, completion: { (isfinished) in
            if isfinished {
                oldVC.didMove(toParentViewController: nil)       //手動調(diào)用
                newVC.didMove(toParentViewController: self)      //手動調(diào)用
                
                self.currentVC = newVC
            }
        })
  • 子控制器中:
    監(jiān)聽切換狀態(tài):
    //移除徒像,則parent == nil
    override func willMove(toParentViewController parent: UIViewController?) {
        debugPrint("will move..parent=" + ((parent == nil) ? "nil" : "parent"))
    }
    
    //移除黍特,則parent == nil
    override func didMove(toParentViewController parent: UIViewController?) {
        debugPrint("did move..parent=" + ((parent == nil) ? "nil" : "parent"))
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锯蛀,隨后出現(xiàn)的幾起案子灭衷,更是在濱河造成了極大的恐慌,老刑警劉巖旁涤,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔曲,死亡現(xiàn)場離奇詭異,居然都是意外死亡劈愚,警方通過查閱死者的電腦和手機瞳遍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菌羽,“玉大人掠械,你說我怎么就攤上這事。” “怎么了猾蒂?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵均唉,是天一觀的道長。 經(jīng)常有香客問我肚菠,道長舔箭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蚊逢,我火速辦了婚禮层扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘时捌。我一直安慰自己怒医,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布奢讨。 她就那樣靜靜地躺著,像睡著了一般焰薄。 火紅的嫁衣襯著肌膚如雪拿诸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天塞茅,我揣著相機與錄音亩码,去河邊找鬼。 笑死野瘦,一個胖子當著我的面吹牛描沟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞭光,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吏廉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惰许?” 一聲冷哼從身側(cè)響起席覆,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汹买,沒想到半個月后佩伤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡晦毙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年生巡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片见妒。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡孤荣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垃环,我是刑警寧澤邀层,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站遂庄,受9級特大地震影響寥院,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涛目,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一秸谢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霹肝,春花似錦估蹄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讯赏,卻和暖如春垮兑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漱挎。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工系枪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕谅。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓私爷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膊夹。 傳聞我的和親對象是個殘疾皇子衬浑,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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