私は次の問題を抱えています:
4つのタブを持つタブバーアプリケーションを作成しました。最初のタブコントローラーから3番目のタブコントローラーにオブジェクト/変数を渡し、このコントローラーを対応するオブジェクトで初期化します。
私はすでにいくつかの研究をしました。クリーンモデルアプローチに対応する最良の方法は、呼び出されたビューコントローラでinitWithObject:メソッドを呼び出すことです。どうすればこれを達成できますか?呼び出し元コントローラー内で受信側コントローラーのinit
メソッドを呼び出すにはどうすればよいですか?コード例を教えてください。
編集:複数のビュー/クラス間などでデータを渡すには、複数のクラス間で共有されるデータを保持するある種のデータクラスを作成するだけです。詳細については、リンクをたどってください: シングルトン
アプリケーションのデータを格納するデータモデルオブジェクトが必要です。
データモデルは、アプリケーションのどこからでもアクセスできる、カスタマイズされたスタンドアロンオブジェクトです。データモデルオブジェクトは、ビューまたはビューコントローラについて何も知りません。データとそのデータ間の論理関係を格納するだけです。
アプリのさまざまな部分がデータの書き込みまたは読み取りを行う必要がある場合、それらはデータモデルに書き込みおよび読み取りを行います。あなたの場合、view1はアンロード時にデータをデータモデルに保存し、view2はロード時にデータモデルからそのデータを読み取ります(またはその逆)。
適切に設計されたアプリでは、2つのビューコントローラーが別のコントローラーの内部データにアクセスできないようにする必要があります。 (ビューコントローラーが別のコントローラーの存在を知る必要がある唯一の理由は、他のコントローラーのロードをトリガーする必要があるかどうかです。)
データモデルを作成するための手っ取り早い方法は、アプリデリゲートに属性を追加してから、次のコマンドを使用してViewControllerからアプリデリゲートを呼び出すことです。
YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;
これは小さなプロジェクトでは機能しますが、データが複雑になるにつれて、データモデル専用のクラスを作成する必要があります。
編集:
特定のケースを明確にするために、レシーバーのviewControllerがアクティブになったときにデータモデルに呼び出しを追加します。
データをinitメソッドまたはviewDidLoad
に配置しても機能しません。これは、UITabBar
では、ユーザーがビューをアンロードしたり、ビューコントローラーを再初期化したりせずに前後に切り替えることができるためです。
変化するデータを取得するのに最適な場所は、viewWillAppear
コントローラーメソッドです。そうすれば、ユーザーがそのタブに切り替えるたびにデータが更新されます。
NSNotificationCenter
( 参照 );を検討することをお勧めします。 1つのビューコントローラをアプリケーション通知センターに登録し、選択が行われたときに通知を送信します。通知を受信すると、他のビューコントローラはそれに応じて自身を更新します。
これはベストプラクティスではないと思います(構文も確認してください)が、次のことを回避しました。
.hで
otherclassref *otherclassname
@property (assign) otherclassname otherclassref;
と.mで
@synthesize otherclassref;
次に、便利な場所から参照を割り当てます。アプリデリゲート、またはビューコントローラーをインスタンス化する場所。
次に、ViewControllerは他のViewControllerへの参照を取得できます。
@class secondviewcontrollerをfirstviewcontrollerの.hファイルに追加し、#imports "secondviewcontroller.h"を最初のviewcontrollerの.mファイルに配置します。これらは前方参照と呼ばれ、.hファイルが相互に参照することに起因するコンパイラエラーを防ぎます。