4

私はvcAと呼ばれるviewControllerを使用しており、これを実行します。

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

そしてそれは動作します。vcBがプッシュされます。vcBのviewDidAppear内で私はこれを行います:

NSArray *controllers = self.navigationController.viewControllers;

コントローラには、vcAという1つのオブジェクトしか含まれていません!!!! (何?)

vcBがコントローラーアレイに追加されるのはなぜですか?それを防ぐことができるものはありますか?

ありがとう。

4

2 に答える 2

8

ビューコントローラーをナビゲーションコントローラースタックにプッシュすることを含むこの問題を解決するために、私は1週間壁に頭をぶつけました。

問題はこれでした:私はナビゲーション制御ベースのアプリを使用していて、3つのビューコントローラー、vA、vB、vCを持っていました。

私はこれを使用してvAからvBをプッシュしていました:

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

それは機能しましたが、vBからvCをプッシュしようとすると、vBのself.navigationControllerプロパティはnilであり、vBはナビゲーションコントローラースタックにありませんでした。何?はい、ナビゲーションスタックにvBをプッシュしましたが、vBは追加されていませんでしたが、それでもvBは正しく表示されていました。

vBのviewDidLoad内で、self.navigationControllerがnilではなく、vBがナビゲーションコントローラースタックにあることを発見しましたが、vBのviewDidLoadが終了するとすぐに、vBがナビゲーションコントローラースタックから削除され、そのnavigationControllerプロパティがnilに設定されました。当時、vBはナビゲーションコントローラースタックの外にある一種のゴーストコントロールでした。

vBからvAに戻ることも、vCをプッシュすることもできなかったことを言う必要はありません。

それはどのように起こりますか?

単純な、私はブロックの内側からvBをプッシュしていました...次のようなものです:

void (^ block1)() = ^(){

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

};

UIKit関数(プッシュするもの)が、メインスレッドではないスレッドで実行されている可能性のあるブロックで実行されていたために何が起こっていたか。

これに対する解決策は、これを使用して、メインスレッドへのディスパッチでプッシュをラップすることでした。

void (^ block1)() = ^(){
dispatch_async(dispatch_get_main_queue(),
               ^{
                   [self.navigationController pushViewController:vB animated:YES];
               });

};  

アプリには、viewControllerに接続された間違ったアウトレットに関する別の小さな問題がありましたが、これが主な問題でした。これは、微妙であるため、見つけるのが難しい種類の問題です。ナビゲーションバーに別のボタンを追加したときに問題が見つかりましたが、そのボタンは表示されませんでした。ですから、UIKitに関係する何かが起こっているのか、その場合は起こっていないのではないかと思います。ここでの大きな問題は、このコードがクラッシュせず、エラーメッセージも何も表示されず、動作が悪いだけで動作していることです。

于 2012-11-08T00:18:38.363 に答える
2

これはあなたのチェックのタイミングと関係があると思います。メソッドの間pushViewController、次のView ControllerのviewWillAppear:メソッド(およびチェックしているメソッドなどの他のメソッド)が呼び出される過程にあります。これらすべてのメソッドが呼び出された後、アニメーションが完了した後、ビューコントローラーがナビゲーションスタック上で考慮されると思います。

于 2012-11-07T21:57:49.793 に答える