7

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

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

4

3 に答える 3

8

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

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

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

    IBOutlet id outletToOtherDelegate;

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

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

于 2008-09-17T21:51:37.100 に答える
1

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

ただし、デリゲートクラスの実行内容によっては、タスクが類似している場合は、おそらくそれらを1つのクラスにまとめるだけです。それは問題を完全に取り除くでしょう。

于 2008-09-17T19:49:58.530 に答える
1

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

于 2008-09-17T19:49:26.893 に答える