0

ボタンのタッチからのアクションを、ファイルの所有者として機能するコントローラー以外のコントローラーに送信しようとしています。画面には 4 つの個別のコントローラー (buttonController、toolbarController、textController、graphicController) と他の 4 つを制御する 5 番目のコントローラー (mainController) で管理したい 4 つの異なる領域があります。mainController は、File's Owner に関連付けられたものでもあります。ボタンの押下を mainController で処理するのは簡単です。

MainController.h ファイル:

- (IBAction)buttonIsTouched:(id)sender;

MainController.m ファイル:

- (IBAction)buttonIsTouched:(id)sender {
    ..handle button touch event etc.
}

次に、Interface Builder で、ボタンの Touch Down イベントを File's Owner に関連付け、選択buttonIsTouchedして離れます。すべて正常に動作します。ただし、ファイルの所有者コントローラーではないコントローラーに対してまったく同じことを行うと、アプリケーションがクラッシュします。これが私がしたことです:

mainController のインスタンス変数として 4 つのコントローラーを作成します。でそれらをインスタンス化し-[MainController viewDidLoad]ます。上記とまったく同じボタン処理メソッドを提供する Interface Builder で、オブジェクト テンプレートを Library から mainController.xib ブラウザーに (4 回) ドラッグします。これらのオブジェクトのタイプをそれぞれButtonControllerToolBarControllerTextControllerおよびに設定しGraphicsControllerます。Touch Down ボタン イベントをButtonControllerオブジェクトに関連付け、buttonIsTouchedエントリを選択します (小さなポップアップ ボックスで) アプリケーションをビルドして実行します ボタンをクリックします クラッシュ - 申し訳ありませんが、エラー コードを書き留めていませんでしたが、INVALID_ACCESS に似ていました

もちろん、すべての入力を最初に mainController に送信してから、個々のコントローラーに委譲することもできますが、これは洗練されていない解決策のように思えます。mainController を通過してから、イライラする場合は親切に戻る必要があります。

誰かがこれを行う方法を知っていて、私がやりたいことと似たようなことをするサンプルコードを持っているなら、私はそれを感謝します.

交流

4

1 に答える 1

1

あなたのアプローチの問題の 1 つは、4 つのサブコントローラーButtonControllerToolBarControllerTextControllerおよびのそれぞれに対して 2 つのオブジェクトをインスタンス化することGraphicsControllerです。でプログラムによってコントローラを作成しviewDidLoadていますが、それらはロードされた nib からすでにインスタンス化されています。

でコントローラを作成するべきではありませんviewDidLoadが、代わりに保持IBOutletプロパティを使用MainControllerして IB で接続します。

その後、コントローラ オブジェクトは によって所有されMainController、nib のロード後に削除されません。これにより、メモリエラーも解消されます。

于 2010-02-05T11:30:37.070 に答える