私のプロジェクトは複雑です(おそらく少し多すぎるでしょう)が、質問は簡単です。コードは次のとおりです
...
self.vc = [[ClassName alloc] init];
if ([[self.navigationController.viewControllers lastObject] isKindOfClass:[ClassName class]]) {
[self backAndGo:self.vc title:@"Title"];
}
else {
[self vai:self.vc title:@"title"];
}
...
このコードでは、現在のビューが と異なる場合は次のビューに直接移動する必要がありますClassName
。それ以外の場合は、1 つのビューに戻って次のビューに移動します。
- (void)backAndGo:(id)ビュー タイトル:(NSString *)タイトル
- (void)backAndGo:(id)view title:(NSString *)title
{
NSLog(@"before %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);
[self.navigationController popViewControllerAnimated:NO];
ALCParentViewController *viewController = (ALCParentViewController *)view;
[self.navigationController pushViewController:viewController animated:YES];
NSLog(@"after %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);
}
ALCParentViewController は vc の親クラスです。このメソッドでは、ナビゲーション コントローラーの最初のログはビュー コントローラーのすべてのスタックで正しく、popViewController
実行されますが、2 番目のログでは、navigationController は明らかに要素が 0 の null であり、pushViewController
メソッドは実行されません。なぜ?何か案は?
- (void)vai:(id)ビュー タイトル:(NSString *)タイトル
- (void)vai:(id)view title:(NSString *)title
{
ALCParentViewController *viewController = (ALCParentViewController *)view;
[self.navigationController pushViewController:viewController animated:YES];
}
これは代わりに、2番目のビューに直接到達するための他の方法であり、正しく機能します.もう1つの奇妙なこと(ほとんど私にとって)は、nil pushviewcontrollerにかかわらず、他のビューのナビゲーション(プッシュとポップ)が正しく動作することです...
編集1:
lucaslt89 が言ったように、2 番目のログにブレークポイントを設定し、コンソールで「po self.navigationController」を作成しました。結果は次のとおりです。
(lldb) po self.navigationController
$0 = 0x00000000 <nil>
(lldb)
それはnilですが、ブレークポイントのないログでそれを見ることができます...
編集2:
(lldb) po self.navigationController
$0 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb) po auxNavController
$1 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb)
lucaslt89 によって提案された操作の後、2 つのアドレスは同じです