2 つの UIViewControllers を持つ単純なストーリーボード アプリケーションを作成しており、モーダル セグエを使用してそれらを切り替えています。各 UIViewController には、別の UIViewController へのセグエを実行するために使用される 1 つの UIButton があります。viewDidLoad メソッドでは、各 UIViewController でその UIButton の外観をアニメーション化します。Cross Dissolve Modal セグエを使用しています。
最初の UIViewController で UIButton を押すと、2 番目の UIViewController に移動し、アニメーションが実行され、2 番目の UIViewController が表示されます。2番目のUIView ControllerでUIButtonを押すと、最初のUIViewControllerが表示され、アニメーションが実行されます。すべてがうまく見え、UIViewController に移動するたびに、viewDidLoad メソッドが各 UIViewController に対して呼び出されます。そして、それは素晴らしいです。
XCode Interface Builder でデフォルトで提供されている Modal セグエ タイプを Cross Dissolve から他の 2 つに変更しようとしました。私は Cover Vertical に変更しましたが、何も変更せずにすべてが正常に機能しました。しかし、 Flip Horizontal Modal segueを試したところ、問題が発生しました。
Flip Horizontal Modal セグエを実行すると、両方の UIViewControllers に私の UIButton が表示されますが、アニメーションは実行されません。デバッグを試みましたが、アニメーション コマンドが実行されていることは確かですが、アニメーションが表示されません。
それが私の最初の質問です:これらのタイプのモーダルセグエの間にアニメーションが表示されない原因となる違いがあることを誰か知っていますか?
その他の質問は、セグエとメモリ管理の基本理論に関連しています。セグエを実行して UIViewController に移動すると、毎回 viewDidLoad メソッドが呼び出されます。では、viewDidLoad メソッドが実行されるたびに新しいオブジェクト インスタンスを作成したということでしょうか。
また、 viewDidUnload メソッドが呼び出されないことにも気付きました。前の質問への回答が肯定的である場合 (viewDidLoad の実行ごとに新しいオブジェクト インスタンスが作成される)、それは私の UIViewController オブジェクト インスタンスがアンロードおよび削除されないことを意味しますか? それとも、ARC が舞台裏でガベージ コレクションを行っているのでしょうか。
ストーリーボードのセグエとメモリ管理/オブジェクトのライフサイクルで物事がどのように機能するか、およびviewDidUnloadメソッドが呼び出されない理由を誰かが説明できれば、とても感謝しています.
[編集 #1: モーダル セグエの実行後に UIViewController をアンロードしようとする]
[更新 #1: これは行うべきではありません。viewDidUnload が自動的に呼び出されます]
UIButtonクリックに付属するIBActionでセグエを作っています。モーダルセグエを実行するために、この平和なコードを書きました。
@try
{
[self performSegueWithIdentifier:segueToPerform sender:self];
}
@catch (NSException *exception)
{
NSLog(@"Exception: %@", exception);
}
@finally
{
[self viewDidUnload];
}
@finally ブロックで手動で viewDidUnload を呼び出しました。天気予報を確認しました viewDidUnload が実行時に呼び出され、はい、呼び出されます。
これは、別の UIViewController からモーダル セグエを使用して移動したときに作成した UIViewController オブジェクトをアンロードし、メモリから削除できたということですか?
このメソッドは次の代わりとして定期的ですか:
[self dismissViewControllerAnimated:YES completion:nil];
この上記の行は、現在の UIViewController に移動した元の UIViewController に戻りますが、現在の UIViewController から他の UIViewControllers への新しいセグエを実行する必要があるため (現在の UIViewController に移動した元の UIViewController に戻る以外に)、それは私のニーズに合わないためです。 1)?
[編集 #2: 終了]
最後に、実装モデルを変更し、これらの UIView 用に個別の XIB ファイルを作成した後、単一の UIViewController の下に新しい UIView をロードしました。@dasblinkenlight からの回答には多くの有用な情報が含まれており、その回答に関する議論はモーダル セグエの使用に関するいくつかの疑問に対する適切な回答を提供するため、正しい回答としてマークしました。