Objective-C でのデリゲート クラスの接続
-
01-07-2019 - |
質問
Interface Builder ファイルには 2 つのコントロールがあり、それらの各コントロールに対してコード内で別のデリゲート クラス (Control1Delegate と Control2Delegate) を作成しました。インターフェイス ビルダーで 2 つの「オブジェクト」を作成し、それらをそのタイプにして、コントロールをデリゲートとしてそれらに接続しました。デリゲートは問題なく機能します。私の問題は、ある代理人から別の代理人に情報を共有する必要があるのですが、その方法がわからないことです。
これを行うための最良の方法は何ですか?2 つのデリゲートを 1 つのクラスに結合しますか、それとも何らかの方法で両方が読み取り可能な 3 番目のクラスにアクセスしますか?コードのどこにもクラスを実際に初期化していないため、実際のインスタンスへの参照を取得する方法 (実際のインスタンスがある場合)、または「メイン」クラスにアクセスする方法さえわかりません。プロジェクトは付属していました。
解決
いずれかのデリゲートからもう一方のデリゲートにアウトレットを追加できます。IB のオブジェクトにアウトレットを追加するには 2 つの方法があります (Xcode/IB バージョン 3.0 以降を使用していると仮定します)。
デリゲート クラスのコードをまだ生成していない場合は、目的のデリゲートを選択し、IB インスペクターで [オブジェクト ID] タブを開きます。NSObject 型の「クラス アウトレット」を追加します。これで、この新しいアウトレットを他のデリゲートに設定できるようになります。もちろん、nib をロードする前に、デリゲート クラスのコードを生成し、生成されたソース ファイルを Xcode プロジェクトに追加する必要があります。
すでにデリゲート クラスのコードを生成している場合 (または NSObject を NIB に追加し、その Class を Xcode プロジェクト内の既存のクラスに設定している場合)、インスタンス変数をデリゲート クラスに追加します。
IBOutlet id outletToOtherDelegate;
Xcode プロジェクトが開いている限り (NIB ウィンドウの左下にある緑色のバブルで示されているように)、IB は新しいアウトレットを自動的に検出し、それを NIB 内の他のデリゲート オブジェクトに割り当てることができます。
Cocoa は、NIB のロード時にこれらのアウトレットを自動的に接続します。一度 awakeFromNib
がデリゲート オブジェクトのインスタンスで呼び出される場合、NIB 内の他のすべてのオブジェクトがインスタンス化され、すべてのアウトレットが接続されていると想定できます。への呼び出しで注文を想定しないでください。 awakeFromNib
, 、 しかし。
他のヒント
それぞれにアウトレットを作成し、それらをクロスバインドして、それぞれが常に同じデータを持つようにできると思います。共有する必要があるモデル オブジェクトが 1 つだけであれば、それは非常にきれいです。実際のところ、これを行う方法がわかりません。iPhone のチュートリアルで一度見たことがあると思います。
現在仕事中のため目の前に Mac がありませんが、一方のデリゲートのインスタンスをもう一方のデリゲートのメンバーにバインドすることは可能でしょうか?これは、たとえば NSArrayController を別のコントローラー クラスのメンバーにバインドすることに似ています。
ただし、デリゲート クラスの実行内容にもよりますが、タスクが類似している場合は、それらを 1 つのクラスに結合するだけでしょう。そうすれば問題は完全に解消されます。