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 からこのコントローラー (ファイルの所有者) に接続すると、すべてが期待どおりに機能します。ほとんどのアップル コード チュートリアルでは、委譲されたメソッドを個別のクラスではなくランダムなオブジェクトに配置していることがわかりました。その理由を知りたいです。デリゲートを別のクラスに置くことはできませんか?
ここで何が欠けていますか?ヌルポインタ?オブジェクトのライフサイクル?