2011-08-16 39 views
2

ビューコントローラのMy viewDidLoadが2回呼び出されました。 1回目は[UIViewController View]、2回目は[UINib instanciateWithOwner:Options]である。なぜこうなった?それは防ぐことができますか?viewDidLoadが2回呼び出されました

おかげ

答えて

6

あなたはviewDidLoadの内側に置かれた任意のコードは、すべての問題外で複数回実行することができるはずです。あなたのコントローラのために一度だけ実行する必要があるコードを持っているなら、-awakeFromNibを使用してください。理由は、View Controllerのビューを複数回アンロードしてロードできるためです。 viewDidLoadのコードは、現在の状態を反映するようにUIを変更する必要があります。

ここで私はそれをやり遂げました。あなたの特定の問題はバグであるように見えます。 Ned's answerを参照してください。

+0

良い答え。しかし、いくつかの隠れた参照がない限り、ViewDidLoadが複数回呼び出されるかどうかはわかりません。しかし、私は間違っているかもしれません。 –

+0

viewDidLoadは、ビューが必要なときに自動的に呼び出されますが、ビューは必要ではありません。 'controller.view'や' [controller view] 'を使うと、元々ビューがnilだった場合にviewDidLoadが呼び出されます。ビューがinstanciateWithOwnerに設定されていなかったり、後でアンロードされた場合は、再度呼び出された理由が考えられます。 – Joe

1

オブジェクト構築のメカニズムを確認する必要があります。コントローラを参照するnibファイルが1つしかない場合、このメソッドは複数回呼び出されるべきではありません。 (オブジェクトが再構築されている場合を除いて)。

あなたはViewDidLoad idemPotent内にコードを作成する必要があるかもしれないと思います。フレームワークコールバックメソッドがこの前提を確実にすることは、常に確実なことです。

0

のバグかもしれないように見えます。

ルール#1:[init]関数でビュー関連設定を呼び出さないでください。すべてのビュー関連設定は、viewDidLoadおよびviewWillAppearで行われなければなりません。

ルール#2:viewDidLoadとviewWillAppearを確認してください、彼らは正しいスーパーファンクションを呼び出していますか?たとえば、viewDidLoad - > super viewDidLoadなどです。

これが役に立ちます。

0

私の場合は、私のユニットテストでviewDidLoadを呼び出している間、私はviewDidLoadでself.view(一度)を使用しました。これで2回の呼び出しが行われました。しかし、[testedViewController viewDidLoad]を[testedViewControllerビュー]に置き換えると、ダブルコールの問題はなくなりました。

関連する問題