3

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

インターフェイスに UITextField があります。ユーザーがキーボードをタップするとキーボードが表示されますが、キーボードを非表示にする方法を手動でプログラムする必要があります。デリゲートを使用して実行できます。したがって、IB では、ライブラリからオブジェクトを取得し、そのクラス名を 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 でクラッシュします。面白いことに、メソッドをコントローラー ファイル (1 つのウィザードが生成したもの) に移動し、UITextField からこのコントローラー (ファイルの所有者) に接続すると、すべてが期待どおりに機能します。ほとんどのアップル コード チュートリアルでは、委譲されたメソッドを個別のクラスではなくランダムなオブジェクトに配置していることがわかりました。その理由を知りたいです。デリゲートを別のクラスに置くことはできませんか?

ここで何が欠けていますか?ヌルポインタ?オブジェクトのライフサイクル?

4

3 に答える 3

1

Control1Delegate オブジェクトは、作成後すぐに破棄されます。最上位の Nib オブジェクトを存続させたい場合は、それらをすべて保持する必要があります。Resource Programming Guide: The Nib Object Life Cycleを参照してください。

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

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

オブジェクトが不要になったら、忘れずにオブジェクトを解放してください。

于 2009-01-20T17:41:14.017 に答える
0

あなたがた両方に感謝します。問題を解決する方法がわかっただけでなく、Nib 作成プロセスでオブジェクトがどのように保持されるかをようやく理解できました。IB でオブジェクトを作成するだけでは不十分です。新しいエンティティの場合は、ファイルの所有者で実際の ivar に接続する必要があります (適切に合成された getter/setter を使用)。

于 2009-01-20T19:27:24.613 に答える
0

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

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

于 2009-01-20T17:16:16.937 に答える