UINavigationController是IOS編程中的一個view controller的容器,通過棧管理viewControllers,每一次push操作都將在棧頂添加一個view controller,然后通過pop將該棧最頂端的controller移除。
我們在工程中,通常會在controller中執行
[self.navigationController popViewControllerAnimated:NO];來移除棧頂controller。
假設現在有UIViewController的子類對象,A、B、C、D。
//將A控制器設置為根控制器
UINavigationController *myFirstCtrl =
[[UINavigationController alloc] initWithRootViewController:myFirstCtrl];
self.window.rootViewController = m_firstCtrl;
//在A控制器中,push B控制器
....
[self.navigationController pushViewController:B animated:NO];
....
//在B控制器中,push C控制器
....
[self.navigationController pushViewController:C animated:NO];
....
//在C控制器中,push D控制器
....
[self.navigationController pushViewController:D animated:NO];
....
則此時A控制器的棧中,有四個元素,我們認為在B、C、D中都沒有pop操作,此時,在A控制器中,執行[self.navigationController popViewControllerAnimated:NO];則是將D控制器從棧中移除,並非我們理解的將A控制器本身移除。同樣,再次執行時,是將C控制器移除。
以前,我都是認為移除自身的,今天跟同事進行討論后,寫了一個demo驗證了一下,才知道了真相。所以,寫出來跟大家分享一下,也許大家已經知道了,聞道有先后,雖然我可能知道的遲了點,但是我還是很高興分享出來,給還不知道的朋友。