出棧操作
-
popViewControllerAnimated:返回上一級(jí) -
popToRootViewControllerAnimated:返回根控制器 -
popToViewController: animated:返回到指定的子控制器
-
通過(guò)示例,來(lái)熟悉出棧的幾個(gè)方法
-
分析
- 層級(jí):"紅色(第1層) -->黃色(第2層)-->綠色(第3層)-->桔色(第4層)"
- 各個(gè)層級(jí)
- 點(diǎn)擊"下一級(jí)控制器"按鈕,
- pushViewController: animated:(入棧操作) - 點(diǎn)擊"控制器數(shù)量"按鈕,打印
navigationController - 導(dǎo)航控制器里面有多少子控制器!
驗(yàn)證: 是否將子控制器添加到"導(dǎo)航控制器"里面。(入棧)
- 點(diǎn)擊"下一級(jí)控制器"按鈕,
- 綠色的控制器
- 點(diǎn)擊'返回上一級(jí)'按鈕,返回到"黃色的控制器"
- 桔色的控制器,
- 點(diǎn)"返回指定控制器"按鈕,切換到黃色控制器
- 點(diǎn)"返回根控制器"按鈕,切換到紅色控制器
-
分析
-
示例代碼
-
OneViewController - 紅色控制器-- 下一級(jí)控制器 - (IBAction)btnNextClick:(id)sender { TwoViewController *twoVC = [[TwoViewController alloc]init]; [self.navigationController pushViewController:twoVC animated:YES]; } -- 打印控制器的數(shù)量 - (IBAction)btnNumClick:(id)sender { NSLog(@"self.childVC= %@",self.navigationController.childViewControllers); } -
ThreeViewController - 綠色控制器-- 返回上一級(jí)控制器.-'返回黃色控制器' - (IBAction)btnThreeReturnClick:(id)sender { [self.navigationController popViewControllerAnimated:YES]; } -
FourViewController - 桔色控制器-- 返回到指定的控制器,'dataVC[1] -- 也就是黃色控制器' - (IBAction)btnReturnToClick:(id)sender { -- 獲取導(dǎo)航控制器里,所有的子控制器。 NSArray<UIViewController *>* dataVC = self.navigationController.childViewControllers; [self.navigationController popToViewController:dataVC[1] animated:YES]; -- ? 以下是錯(cuò)誤示范: 必須是已經(jīng)在導(dǎo)航控制器里面的子控制器,才能切換. 新創(chuàng)建的控制器,無(wú)法切換,因?yàn)樵趯?dǎo)航控制器里面找不到。 OneViewController *oneVC = [[OneViewController alloc]init]; [self.navigationController popToViewController:oneVC animated:YES]; } -- 返回到根目控制器 - (IBAction)btnReturnRootClick:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; } - 注意:
-
-popToViewController: animated:返回到指定的子控制器,
此子控制器,必須得要在childViewControllers中,否則:
NSInternalInconsistencyException
-
-
-
出棧做了哪些操作?
- 銷毀"導(dǎo)航控制器"里的子控制器
- 注意:
它是先將要銷毀子控制器,集中在一個(gè)棧里,
然后再刪除。 - 假設(shè)當(dāng)前控制器是"桔色控制器",更加上面"層級(jí)所示"那么內(nèi)部,應(yīng)該是這樣得.
- 此時(shí),點(diǎn)擊"返回根控制器",按照一般來(lái)講.銷毀順序:
"桔色控制器 -->綠色控制器 -->黃色控制器", 可實(shí)際銷毀順序:
"黃色控制器 -->綠色控制器 -->桔色控制器".這是因?yàn)?
- 把子控制器,集中在一個(gè)棧里,然后再銷毀.


