2016-08-30 47 views
0

當我以模態方式呈現UINavigationController,然後將一些UIViewcontrollers(無動畫)推到它上時,最終顯示的navigationItem.title與我所期望的不同。iOS中的UINavigationController標題似乎已損壞

我試圖縮小我的問題來,想出了下面的短代碼複製的問題:

@implementation DummyRootVC 
- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:[[Dummy1VC alloc] init]]; 
    [self presentViewController:nc 
          animated:false 
         completion:nil]; 
} 
@end 

@implementation Dummy1VC 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor=[UIColor whiteColor]; 
    self.navigationItem.title= @"DUMMY1"; 
    [self.navigationController pushViewController:[[Dummy2VC alloc] init] 
             animated:false]; 
} 
@end 

@implementation Dummy2VC 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title= @"DUMMY2"; 
    self.view.backgroundColor=[UIColor yellowColor]; 
    [self.navigationController pushViewController:[[Dummy3VC alloc] init] 
             animated:false]; 
} 
@end 

@implementation Dummy3VC 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor=[UIColor orangeColor]; 
    self.navigationItem.title= @"DUMMY3"; 
    [self.navigationController pushViewController:[[Dummy4VC alloc] init] 
             animated:false]; 
} 
@end 

@implementation Dummy4VC 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title= @"DUMMY4"; 
    self.view.backgroundColor=[UIColor greenColor]; 
    for (UIViewController* vc in self.navigationController.viewControllers) { 
     NSLog(@"VC Stack: %@ Title:%@",vc,vc.navigationItem.title); 
    } 
    NSLog(@"End"); 
} 
@end 

在AppDelegate中我設置:

self.window.rootViewController = [[DummyRootVC alloc] init]; 

當運行代碼顯示的標題是「虛擬2」,後退按鈕被命名爲「虛擬4」,而我實際上會期望一個標題「虛擬4」和一個名爲「虛擬3」的後退按鈕。

日誌顯示如預期的正確視圖控制器,堆棧和backgroundColor時(如預期),綠色(和有趣之後仍然是一個「回」點擊綠色):

VC堆棧:標題:DUMMY1

VC堆棧:標題:DUMMY2

VC堆棧:標題:DUMMY3

VC堆棧:標題:DUMMY4

我能解決這個問題,因爲它似乎有點關係與呈現導航控制器模態組合的非動畫設置,但我想了解底層問題...

燦任何人都能爲我提供一些見解?這是一些錯誤還是我正在做(正如我懷疑)只是錯誤的方式?

謝謝!

+0

您可以設置斷點,看看哪些線被稱爲第一 – Tj3n

+0

@ Tj3n我沒有和被調用方法的順序與預期一致。 – McMini

+1

只是在我的實踐中,在viewDidLoad中調用push/present ...從來不是一個好主意,發生了很多奇怪的行爲,所以我建議在'viewWillAppea'或'viewDidAppear'中調用它,爲什麼然後我不知道 – Tj3n

回答

1

把推/目前從viewDidLoadviewWillAppearviewDidAppear從而使的viewController可以初始化它的子視圖正確,以避免問題:d