0

私のプロジェクトは複雑です(おそらく少し多すぎるでしょう)が、質問は簡単です。コードは次のとおりです

...
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 つのアドレスは同じです

4

3 に答える 3

2

わかりました、質問が閉じられたとしても、今後の訪問者のために説明をしたいと思います. ドキュメントによると: ... ビュー コントローラーがナビゲーション コントローラー内に埋め込まれていない場合、このプロパティは nil です。

それはまさに pop 命令で行うことです。したがって、基本的には、ポップによってナビゲーション コントローラーへの参照が失われる前に、必ず参照を保存してください。

于 2013-07-18T00:38:08.683 に答える
0

backAndGoメソッド: 最初にviewControllerをポップし、次に別の ViewController をプッシュします。

問題は、viewControllerをポップした後、「自己」がゼロになることです。したがって、「self.navigationController」を使用して navigationController を取得すると、何も返されません。

その理由は、navigationController が空ではなく、「self」が nil であるためです。そういうわけで lucastl89 の答えは効果的です。彼は、「self」を使用して検索するのではなく、参照によって navigationController オブジェクトを保持します。

于 2016-09-04T06:21:07.707 に答える