ビューコントローラーをナビゲーションコントローラースタックにプッシュすることを含むこの問題を解決するために、私は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に関係する何かが起こっているのか、その場合は起こっていないのではないかと思います。ここでの大きな問題は、このコードがクラッシュせず、エラーメッセージも何も表示されず、動作が悪いだけで動作していることです。