質問

XcodeとInterface Builderを使用して、iPhone用のシンプルなプロジェクトを作成しています。デリゲートが何であるかは理解していますが、デリゲートの使用に問題があります。

インターフェイスにUITextFieldがあります。ユーザーがキーボードをタップするとキーボードが表示されますが、キーボードを非表示にする方法を手動でプログラムする必要があります。デリゲートを使用して実行できます。したがって、IBでは、ライブラリからObjectを取得し、そのクラス名をControl1Delegateとして指定し、テキストフィールドからデリゲートアウトレットをこのControl1Delegateに接続します。このControl1Delegateクラスの.mファイルと.hファイルもあります。

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

しかし、これは機能しません。実行中、textFieldShouldReturnメソッドに到達することも、msgなしで、またはEXEC_BAD_ACCESSを使用してクラッシュすることもありません。面白いことに、メソッドをコントローラーファイル(ウィザードが生成したもの)に移動し、UITextFieldからこのコントローラー(ファイルの所有者)に接続すると、すべてが期待どおりに動作します。ほとんどのアップルコードチュートリアルでは、クラスを分離するのではなく、委任されたメソッドをランダムオブジェクトに配置することがわかりました。その理由を知りたいと思います。デリゲートを別のクラスに入れることはできませんか?

ここで不足しているものは何ですか?いくつかのヌルポインタ?オブジェクトのライブサイクル?

役に立ちましたか?

解決

Control1Delegateオブジェクトは、作成後すぐに破棄されます。最上位のNibオブジェクトを存続させたい場合は、すべて保持する必要があります。 リソースプログラミングガイド:Nibオブジェクトを参照してください。ライフサイクル

ファイルの所有者は、オブジェクトを保持するために、次のようなプロパティを持つことができます。

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

不要になったオブジェクトを解放することを忘れないでください。

他のヒント

デリゲートメソッドは、その目的のために構築されたものを含め、どのクラスにも配置できます。 Apple(および他のプログラマー)が通常、デリゲート関数専用のクラスを作成しない理由は、データを共有するのが非常に複雑で難しくなるためです。たとえば、私のプロジェクトの1つで、ウィンドウ、ウィンドウ内のテーブルビュー、ウィンドウのツールバーからのデリゲートメソッドを処理するウィンドウコントローラーサブクラスを作成します。そのウィンドウの状態を操作および維持するために必要なものはすべて、1つのコントローラークラスにあります。ここで、同じ機能を実行する3つの別個のクラス(およびおそらくそれらを管理するコントローラークラス)を想像してください。

クラッシュする理由については、アプリケーションのどこかでメモリ管理を間違えているようです。デバッガーを使用して、正確にどこから来たかを追跡できます。

ありがとうございます。問題を解決する方法を知っただけでなく、ペン先の作成プロセスでオブジェクトがどのように保持されるかを最終的に理解しました。 IBでオブジェクトを作成するだけでは不十分です。新しいエンティティである場合は、File's Ownerの実際のivarに接続する必要があります(適切に合成されたgetter / setterを使用)。

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