iOS URLNavigator庫(kù)獲取的topMost錯(cuò)誤問(wèn)題解決叉讥,父子控制器的addChild正確添加與移除步驟

2025.01.31 工作變動(dòng)原因捶障,故將一些工作期間Tapd內(nèi)部寫(xiě)的Wiki文檔轉(zhuǎn)移到個(gè)人博客。

URLNavigator三方庫(kù) 跳轉(zhuǎn)失敗肤舞,經(jīng)過(guò)排查后發(fā)現(xiàn)獲取的 UIViewcontroller.navigationController 為空的問(wèn)題解決紫新。

父子控制器的 addChild 正確添加與移除步驟。

一李剖、問(wèn)題排查過(guò)程

問(wèn)題出現(xiàn)點(diǎn)源碼


tapd_44062861_1714122687_959.png
    open func push(_ viewController: UIViewController, from: UINavigationControllerType? = nil, animated: Bool = true) -> UIViewController? {
        guard (viewController is UINavigationController) == false else { return nil }
        // 使用斷點(diǎn)排查芒率,發(fā)現(xiàn)在這里直接 { return nil }了,原因是獲取UIViewController.topMost?.navigationController的時(shí)候篙顺,navigationController為空偶芍,所以決定對(duì)topMost方法進(jìn)行排查。
        guard let navigationController = from ?? UIViewController.topMost?.navigationController else { return nil }
        guard self.delegate?.shouldPush(viewController: viewController, from: navigationController) != false else { return nil }
        navigationController.pushViewController(viewController, animated: animated)
        return viewController
      }

一路斷點(diǎn)排查德玫,發(fā)現(xiàn)在 navigationController 這里直接 { return nil }了匪蟀,原因是獲取 UIViewController.topMost?.navigationController 的時(shí)候,navigationController為空宰僧,所以決定對(duì)topMost方法進(jìn)行排查材彪。

topMost方法

tapd_44062861_1714123000_598.png
        // child view controller
        for subview in viewController?.view?.subviews ?? [] {
          if let childViewController = subview.next as? UIViewController {
          // 最終調(diào)試發(fā)現(xiàn),三方庫(kù)獲取的childViewController并不是我正在顯示的控制器琴儿,而是拿的subView第一個(gè)子控制器(第一個(gè)添加的子控制器視圖)段化,導(dǎo)致為空,所以要對(duì)子控制器進(jìn)行添加造成、移除管理解決显熏。
            return self.topMost(of: childViewController)
          }
        }

最終調(diào)試發(fā)現(xiàn),三方庫(kù)獲取的 childViewController 并不是我正在顯示的控制器晒屎,而是 拿的subView第一個(gè)子控制器(第一個(gè)添加的子控制器視圖)喘蟆,導(dǎo)致為空。

因?yàn)槲?只對(duì)子控制器做了添加(addChild)鼓鲁,然后使用 subView.ishidden來(lái)控制隱藏出現(xiàn)的問(wèn)題履肃,所以要對(duì)子控制器進(jìn)行添加、移除管理解決坐桩。

二尺棋、父子控制器的addChild添加、移除正確管理

主控制器mainVC

// 在主控制器點(diǎn)擊 tab_A 切換子控制器
if title == "tab_A" {
    // 添加子控制器1
    let squareVC = UIViewController()
    // 將VC添加到控制器上绵跷,建立父子關(guān)系膘螟,這時(shí)可以通過(guò)`parentViewController`訪(fǎng)問(wèn)到父控制器;調(diào)用`addChildViewController`系統(tǒng)會(huì)自動(dòng)調(diào)用`willMoveToParentViewController:` 
    addChild(squareVC)
    // 將VC控制器的view添加到父控制器上
    view.addSubview(squareVC.view)
    // 調(diào)用VC的`didMoveToParentViewController`通知VC完成了父子關(guān)系建立碾局。
    squareVC.didMove(toParent: self)
    
    // 移除子控制器2
    let myVC = UIViewController()
    // 通知子控制器即將解除父子關(guān)系
    myVC.willMove(toParent: nil)
    // 將VC的view從父控制器移除
    myVC.view.removeFromSuperview()
    // 通過(guò)`removeFromParentViewController`真正解除父子關(guān)系荆残,并且系統(tǒng)會(huì)調(diào)用`didMoveToParentViewController:`
    myVC.removeFromParent()
}
// 在主控制器點(diǎn)擊 tab_B 切換子控制器
else if title == "tab_B" {
    // 添加子控制器2...
    
    // 移除子控制器1...
    
    // 原理同上
}

1. 子控制器添加:

  1. 將VC添加到控制器上,建立父子關(guān)系净当,這時(shí)可以通過(guò) parentViewController 訪(fǎng)問(wèn)到父控制器内斯;調(diào)用 addChildViewController 系統(tǒng)會(huì)自動(dòng)調(diào)用 willMoveToParentViewController: 蕴潦。
  2. 將VC控制器的view添加到父控制器上。
  3. 調(diào)用VC的 didMoveToParentViewController 通知VC完成了父子關(guān)系建立俘闯。

2. 子控制器移除:

  1. 通知子控制器即將解除父子關(guān)系潭苞。
  2. 將VC的view從父控制器移除。
  3. 通過(guò) removeFromParentViewController 真正解除父子關(guān)系真朗,并且系統(tǒng)會(huì)調(diào)用 didMoveToParentViewController: 此疹。

最終修改后具體實(shí)現(xiàn):

tapd_44062861_1714123000_599.png

最最最后,完結(jié)撒花

告辭.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子质礼,更是在濱河造成了極大的恐慌永淌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脊串,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)清钥,“玉大人琼锋,你說(shuō)我怎么就攤上這事∷钫眩” “怎么了缕坎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)篡悟。 經(jīng)常有香客問(wèn)我谜叹,道長(zhǎng),這世上最難降的妖魔是什么搬葬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任荷腊,我火速辦了婚禮,結(jié)果婚禮上急凰,老公的妹妹穿的比我還像新娘女仰。我一直安慰自己,他們只是感情好抡锈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布疾忍。 她就那樣靜靜地躺著,像睡著了一般床三。 火紅的嫁衣襯著肌膚如雪一罩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天撇簿,我揣著相機(jī)與錄音聂渊,去河邊找鬼差购。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汉嗽,可吹牛的內(nèi)容都是我干的欲逃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诊胞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暖夭!你這毒婦竟也來(lái)了锹杈?” 一聲冷哼從身側(cè)響起撵孤,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竭望,沒(méi)想到半個(gè)月后邪码,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬清,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年闭专,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旧烧。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡影钉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掘剪,到底是詐尸還是另有隱情平委,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布夺谁,位于F島的核電站廉赔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匾鸥。R本人自食惡果不足惜蜡塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勿负。 院中可真熱鬧馏艾,春花似錦、人聲如沸奴愉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躁劣。三九已至迫吐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間账忘,已是汗流浹背志膀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工熙宇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溉浙。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓烫止,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戳稽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馆蠕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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