2013-11-10 66 views
1

我有三個控制器第一,第二,第三。首先是navigationController的rootViewController。嵌套的推動畫可能導致導航欄損壞PUSH POP PUSH

SecondViewController,我有協議稱爲SecondViewControllerDelegate具有委託方法

@protocol SecondViewControllerDelegate <NSObject> 

- (void)doneSucceed:(NSString *)msg; 

@end 

在FirstViewController,我有一個按鈕,當點擊它,執行以下

[self.navigationController pushViewController:_s animated:YES]; 

_s表示其代表爲FirstViewController的SecondViewController

在doneSucceed方法請執行下列操作

- (void)doneSucceed:(NSString *)msg 
{ 
    NSLog(@"%@", msg); 
    [self.navigationController popViewControllerAnimated:YES]; 
    [self.navigationController pushViewController:_t animated:YES]; 
} 

則可能會導致損壞的導航欄 顯示錯誤

嵌套推動畫,誰能告訴我爲什麼? THX

回答

1

將導航控制器假設爲一堆視圖控制器。

[self.navigationController popViewControllerAnimated:YES]; 

確實從彈出無效從stack.Now的視圖 - 控制該視圖 - 控制不valid.And視圖 - 控制您呼叫

[self.navigationController pushViewController:_t animated:YES]; 

,因此,它是一個堆棧中的值是中間是無效,並嘗試從無效中間值推到最高值

如果1,2,3是堆棧的成員,則可以刪除2但刪除的2正嘗試添加上面的2以及3因爲2已經不在堆棧3中,所以不能正確添加

5

問題在於,您正在調用彈出窗口並將動畫背靠背推送。在iOS6的推通話基本上是忽略不計,但在iOS7推被稱爲同時流行正在因此動畫他們是「嵌套」,你會得到如下:

nested push animation can result in corrupted navigation bar show 

而不是內部doneSucceed彈出,你可以讓流行來自SecondViewController的調用。然後等待FirstViewController的viewDidAppear來推送ThirdViewController。您可以使用doneSucceed方法,以此撥動你是否應該過渡到ThirdViewController上viewDidAppear

+0

嗨viewControllers財產做你想做的事情。有幾個線程正在處理這個問題,包括:http://stackoverflow.com/questions/20187526/nested-push-animations-ios7-bug –

0

還有辦法只是通過設置navigationController

NSMutableArray* controllers = [[self.navigationController viewController] mutableCopy]; 
[controllers removeLastObject]; 
[controllers addObject:_t]; 
[self.navigationController setViewControllers:controllers animated:YES] 
相關問題