多次Pop到上級界面

??????? 說到導航的push,pop操作,想必寫代碼的我們基本每天都可能會用到,前兩天遇到一個問題,某些界面我需要pop到上級的上級界面,起初我的想法很簡單,那就是[[self.navigationController popViewControllerAnimated:NO].navigationController popViewControllerAnimated:YES];

??????? 但是沒效果,還是pop到上級界面了,并沒有pop到上級的上級界面,然后我想著這樣行不通,那得,我就用找到對應的那個controller,然后pop到這個界面:

UIViewController *target = nil;

for (UIViewController * controller in self.navigationController.viewControllers) {

???????? if ([controller isKindOfClass:[YourViewControllerName class]]) {

???????????????????? target = controller;

???????? }

}

if (target) {

??????? [self.navigationController popToViewController:target animated:YES];

}

?????? 當然了,這樣也是解決問題了,但是我后來在review代碼的時候,總感覺這樣很累贅,沒道理嘛,簡單的一個出棧操作,肯定是簡單的pop就可以搞定的啊,然后我細心考量了下我之前的哪行pop代碼。What a fuck man! 原來是這樣,[[self.navigationController popViewControllerAnimated:NO].navigationController popViewControllerAnimated:YES];

?????? 我們先看第一行[self.navigation popViewControllerAnimated:NO],這是把當前的ViewController從當前棧中做pop操作,會從當前棧中移除,那會發生什么問題呢?問題就是當前的VC被銷毀了,然后接著看后邊的代碼 .navagationViewController,肯定就沒有什么意義了啊,不用說肯定是nil啊,我們對nil對象發送一個消息指令,objc_msgSend(object, SEL op, ...),對啊,object都是nil了,發消息指令還有用嗎?

解決方法:

?????? 我們需要在這個VC pop之前先把當前的navigationController保存下來,然后利用這個導航做兩個pop操作即可!可以像下邊這樣修改上邊的代碼:

??????????????? UINavigationController *nav = self.navigationController;
??????????????? [self.navigationController popViewControllerAnimated:NO];
??????????????? [nav popViewControllerAnimated:YES];

?????? 我們蘋果的runtime在給nil發送指令的時候是不會crash的,但是在對一個存在的對象發送一個此對象沒有對應的消息指令的時候是會crash的,所以雖然說給nil發送指令(nil調方法)不會crash,但是真要是有這種bug出現的時候其實還是不好找的,切記:判斷對象是否為nil是很有必要的!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 作者唯一QQ:228544117。。。。。 =========后面的都要新建一個文章 AppDelegate.h ...
    CC_iOS閱讀 933評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,204評論 30 471
  • //設置尺寸為屏幕尺寸的時候self.window = [[UIWindow alloc] initWithFra...
    LuckTime閱讀 833評論 0 0
  • 1、改變 UITextField 占位文字 顏色和去掉底部白框 [_userName setValue:[UICo...
    i_MT閱讀 1,054評論 0 2
  • debbie392閱讀 377評論 0 0