しばらくの間、解決策を回避してきた比較的単純な問題があります。ビュー コントローラーと関連する XIB があります。ビューコントローラーは と呼ばれFooterViewControllerます。 FooterViewControllerのビューは、テーブルビューのフッター ビューとして設定されます。
FooterViewControllerのビューには、ユーザーにフィードバックを表示するためのラベルが含まれています。アプリケーションによって値が変更されるまで、このラベルを保持したいと考えています。通常の状況では、そうです。ただし、メモリ警告でテストを開始したばかりで、メモリ警告に応答してビューがアンロードされた後、ラベルがクリアされることがわかりました。
この問題を解決するためにこれまでに試したことは次のとおりですFooterViewController。 の viewWillUnloadメソッドで、ラベルのテキストを というインスタンス変数に保存しますstatusString。
- (void)viewWillUnload
{
statusString = [statusLabel text];
testInt = 5;
NSLog(@"View will unload; status string = %@; testInt = %d",
statusString, testInt);
[super viewWillUnload];
}
として宣言されている別のインスタンス変数もNSInteger testInt5 に設定していることに注意してください。
次に、FooterViewControllerのviewDidLoadメソッドで、ラベルのテキストを次のように設定しようとしますstatusString。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Just before setting label, statusString: %@; testInt: %d",
statusString, testInt);
[statusLabel setText:statusString];
NSLog(@"View did load.");
}
ただし、これは機能しません。さらに、メモリ警告をシミュレートした後のログには、次のように表示されます。
View will unload; status string = Invalid IP address Error code: 113; testInt = 5
(「Invalid IP address Error code: 113」が statusString の正しい値であることに注意してください)
次に、FooterViewControllerもう一度移動すると、次のように表示されます。
Just before setting label, statusString: (null); testInt: 0
これは、何らかの理由で、FooterViewControllerビューが再度読み込まれたときに のインスタンス変数が再初期化されていることを示しています。最後の注意:initWithNibName:bundle:ビューをリロードする必要があるたびにメソッドが呼び出されますが、これは予想通りです。結局、ビューは NIB から再ロードする必要があります。
だから、私の質問はこれらです:
- ビューをアンロードおよび再ロードするプロセスで、これらのインスタンス変数が無効化またはゼロ化されているように見えるのはなぜですか?
- この無効化の原因となっている何か間違ったことをしている場合、それは何ですか?
- 私が間違ったことをしていない場合、これは通常の動作であり、ビューのロード間で状態を維持するにはどうすればよいですか?
ありがとう、ライリー