0

FirstViewController と FourthViewController の 2 つのビュー コントローラーがあります。FirstViewController は私の最初のビュー コントローラーです。FirstViewController に UILabel、mainLab があります。FourthViewController を提示します

[self presentViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"FourthViewController"] animated:YES completion:nil];

次に、デリゲートを使用して、FourthViewController がプッシュされた後、FirstViewController の mainLab のテキストを変更してみます。ただし、これは mainLab のテキストを変更していません。確認したところ、View Controller がプッシュされた後に mainLab が null になります。そうは言っても、FourthViewController のプッシュによって mainLab が無効になったとしても、FourthViewController がプッシュされている間にラベルのテキストを変更するにはどうすればよいですか?

4

1 に答える 1

0

コードの一部を表示する必要があります。ただし、これは、View Controllerのライフサイクルを理解する前に経験した同様の経験から得た推測です(これはかなりよく文書化されています)。

UILabelデリゲート メソッドで UIControls (など) を直接設定すると仮定します。それが本当なら: 帽子をかぶらないでください。IBOutletビュー コントローラを使用せずにアイテムに直接アクセスしたり、アイテムを表示したりしないでください。

NSNumber代わりに、 orであるプロパティを宣言します。これは、NSString設定するデータを運ぶのに適しています。関連するものなども設定するカスタム セッターを提供しますUILabelが、それが nil でない場合に限ります。(private インスタンス変数を宣言し、疑似セッター メソッドを提供することもできます。)viewDidLoadメソッドでも、UILablesプロパティの値に応じて etc. を設定します。

あなたの場合に何が起こるかというと、 UILable のテキストを の前または直後に設定しpresentViewControllerます。1 行のコードで、View Controller をインスタンス化してから提示することさえできます。それを文字通りに受け取ってください。ビュー コントローラーがインスタンス化されます。つまり、新しいものが作成され、すべての値がデフォルトになります (場合によっては nil または空の文字列、またはストーリーボードに設定されているもの)。

ただし、UILabelその後すぐに呼び出し元のビュー コントローラーから (etc.) にアクセスしても、その間に新しくインスタンス化されたビュー コントローラーが完全に読み込まれているという保証はありません。新しいView Controllerが少し遅れてロードされた場合、設定は再び上書きされます。私の忠告に従わない限り。

ビュー項目の値を実際に設定する前に、新しいビュー コントローラーを強制的にロードすることを目的とした「ハック」が他にもあります。そのうちの1つまたは2つを試しましたが、うまくいきました。しかし、それらが将来も機能するという保証はありません。そのため、適切に行うことをお勧めします。

于 2013-08-13T07:56:31.893 に答える