質問

Interface Builder ファイルには 2 つのコントロールがあり、それらの各コントロールに対してコード内で別のデリゲート クラス (Control1Delegate と Control2Delegate) を作成しました。インターフェイス ビルダーで 2 つの「オブジェクト」を作成し、それらをそのタイプにして、コントロールをデリゲートとしてそれらに接続しました。デリゲートは問題なく機能します。私の問題は、ある代理人から別の代理人に情報を共有する必要があるのですが、その方法がわからないことです。

これを行うための最良の方法は何ですか?2 つのデリゲートを 1 つのクラスに結合しますか、それとも何らかの方法で両方が読み取り可能な 3 番目のクラスにアクセスしますか?コードのどこにもクラスを実際に初期化していないため、実際のインスタンスへの参照を取得する方法 (実際のインスタンスがある場合)、または「メイン」クラスにアクセスする方法さえわかりません。プロジェクトは付属していました。

役に立ちましたか?

解決

いずれかのデリゲートからもう一方のデリゲートにアウトレットを追加できます。IB のオブジェクトにアウトレットを追加するには 2 つの方法があります (Xcode/IB バージョン 3.0 以降を使用していると仮定します)。

  1. デリゲート クラスのコードをまだ生成していない場合は、目的のデリゲートを選択し、IB インスペクターで [オブジェクト ID] タブを開きます。NSObject 型の「クラス アウトレット」を追加します。これで、この新しいアウトレットを他のデリゲートに設定できるようになります。もちろん、nib をロードする前に、デリゲート クラスのコードを生成し、生成されたソース ファイルを Xcode プロジェクトに追加する必要があります。

  2. すでにデリゲート クラスのコードを生成している場合 (または NSObject を NIB に追加し、その Class を Xcode プロジェクト内の既存のクラスに設定している場合)、インスタンス変数をデリゲート クラスに追加します。

    IBOutlet id outletToOtherDelegate;

    Xcode プロジェクトが開いている限り (NIB ウィンドウの左下にある緑色のバブルで示されているように)、IB は新しいアウトレットを自動的に検出し、それを NIB 内の他のデリゲート オブジェクトに割り当てることができます。

Cocoa は、NIB のロード時にこれらのアウトレットを自動的に接続します。一度 awakeFromNib がデリゲート オブジェクトのインスタンスで呼び出される場合、NIB 内の他のすべてのオブジェクトがインスタンス化され、すべてのアウトレットが接続されていると想定できます。への呼び出しで注文を想定しないでください。 awakeFromNib, 、 しかし。

他のヒント

それぞれにアウトレットを作成し、それらをクロスバインドして、それぞれが常に同じデータを持つようにできると思います。共有する必要があるモデル オブジェクトが 1 つだけであれば、それは非常にきれいです。実際のところ、これを行う方法がわかりません。iPhone のチュートリアルで一度見たことがあると思います。

現在仕事中のため目の前に Mac がありませんが、一方のデリゲートのインスタンスをもう一方のデリゲートのメンバーにバインドすることは可能でしょうか?これは、たとえば NSArrayController を別のコントローラー クラスのメンバーにバインドすることに似ています。

ただし、デリゲート クラスの実行内容にもよりますが、タスクが類似している場合は、それらを 1 つのクラスに結合するだけでしょう。そうすれば問題は完全に解消されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top