これは、あなたが同じ主題について尋ねた今日の 2 番目の質問であり、あなたがしていることのほとんどは正しくありません。コントローラー間でデータを渡すには、アプリ デリゲートを使用しないでください。また、シングルトンを使用しないでください。あなたがする必要があるのは、基本に戻って、自分が何をしているのかを理解しようとすることです. 2 つのコントローラー間でのデータの受け渡しは、単純な 3 ステップのプロセスです。
- データを保持するために、「渡す」View Controllerにプロパティを作成します。
- 画面上にある、または表示される予定の「受け渡し」コントローラーへの参照を取得します。
- 「引き渡し元」コントローラーからのデータを使用して、作成したそのプロパティの値を設定します。
ほとんどの初心者が混乱するステップは #2 です。「渡す」コントローラーのインスタンスを初期化するだけでなく、作成したものへの参照を取得する必要があります (通常は xib またはストーリーボードで)。それをどのように正確に行うかは、これら 2 つのコントローラーが互いにどのように関係しているかによって異なります。一方が他方のインスタンスを作成し、それをプッシュまたは提示しますか? そのコントローラーは、xib、ストーリーボード、またはコードで作成された「受け渡し」ですか? コントローラーは、ナビゲーション コントローラーまたはタブ バー コントローラーに埋め込まれていますか? コードで 2 番目のコントローラーに移動しますか、それともセグエで直接移動しますか? これらは、あなたが考える必要がある質問であり、どのように答えるかを理解する必要があります。そうすれば、あなたが持っているどんなセットアップでも正しく理解できるようになります.
コントローラーのセットアップ (この 2 つが互いにどのように関係しているか、どこで作成したか) を説明していただければ、ステップ 2 のより具体的な答えを示すことができます。
編集後:
セグエを使用してビュー間を移動する場合、データを渡す場所は prepareForSegue です。TipsViewController は segue.destinationViewController になるので、次のようにします。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"segueName"]) {
TipsViewController *tipsVC = [segue destinationViewController];
tipsVC.bmi = self.bmi;
}
}
この例では、TipsViewController に bmi という名前のプロパティが作成されており、ViewController にもそのプロパティがあると想定しています。これはすべて、Apple の「iOS 用のビュー コントローラ プログラミング ガイド」で説明されています。ぜひ勉強してください。