web-dev-qa-db-ja.com

iPhone:タブバーアプリの複数のビューコントローラー間でデータを渡す方法

私は次の問題を抱えています:

4つのタブを持つタブバーアプリケーションを作成しました。最初のタブコントローラーから3番目のタブコントローラーにオブジェクト/変数を渡し、このコントローラーを対応するオブジェクトで初期化します。

私はすでにいくつかの研究をしました。クリーンモデルアプローチに対応する最良の方法は、呼び出されたビューコントローラでinitWithObject:メソッドを呼び出すことです。どうすればこれを達成できますか?呼び出し元コントローラー内で受信側コントローラーのinitメソッドを呼び出すにはどうすればよいですか?コード例を教えてください。

編集:複数のビュー/クラス間などでデータを渡すには、複数のクラス間で共有されるデータを保持するある種のデータクラスを作成するだけです。詳細については、リンクをたどってください: シングルトン

20
Simon D.

アプリケーションのデータを格納するデータモデルオブジェクトが必要です。

データモデルは、アプリケーションのどこからでもアクセスできる、カスタマイズされたスタンドアロンオブジェクトです。データモデルオブジェクトは、ビューまたはビューコントローラについて何も知りません。データとそのデータ間の論理関係を格納するだけです。

アプリのさまざまな部分がデータの書き込みまたは読み取りを行う必要がある場合、それらはデータモデルに書き込みおよび読み取りを行います。あなたの場合、view1はアンロード時にデータをデータモデルに保存し、view2はロード時にデータモデルからそのデータを読み取ります(またはその逆)。

適切に設計されたアプリでは、2つのビューコントローラーが別のコントローラーの内部データにアクセスできないようにする必要があります。 (ビューコントローラーが別のコントローラーの存在を知る必要がある唯一の理由は、他のコントローラーのロードをトリガーする必要があるかどうかです。)

データモデルを作成するための手っ取り早い方法は、アプリデリゲートに属性を追加してから、次のコマンドを使用してViewControllerからアプリデリゲートを呼び出すことです。

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;

これは小さなプロジェクトでは機能しますが、データが複雑になるにつれて、データモデル専用のクラスを作成する必要があります。

編集:

特定のケースを明確にするために、レシーバーのviewControllerがアクティブになったときにデータモデルに呼び出しを追加します。

データをinitメソッドまたはviewDidLoadに配置しても機能しません。これは、UITabBarでは、ユーザーがビューをアンロードしたり、ビューコントローラーを再初期化したりせずに前後に切り替えることができるためです。

変化するデータを取得するのに最適な場所は、viewWillAppearコントローラーメソッドです。そうすれば、ユーザーがそのタブに切り替えるたびにデータが更新されます。

28
TechZen

NSNotificationCenter参照 );を検討することをお勧めします。 1つのビューコントローラをアプリケーション通知センターに登録し、選択が行われたときに通知を送信します。通知を受信すると、他のビューコントローラはそれに応じて自身を更新します。

4

これはベストプラクティスではないと思います(構文も確認してください)が、次のことを回避しました。

.hで

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

と.mで

@synthesize otherclassref;

次に、便利な場所から参照を割り当てます。アプリデリゲート、またはビューコントローラーをインスタンス化する場所。

次に、ViewControllerは他のViewControllerへの参照を取得できます。

@class secondviewcontrollerをfirstviewcontrollerの.hファイルに追加し、#imports "secondviewcontroller.h"を最初のviewcontrollerの.mファイルに配置します。これらは前方参照と呼ばれ、.hファイルが相互に参照することに起因するコンパイラエラーを防ぎます。

0
PeanutPower