1

UIView基本的にaUILabelとa のサブクラスである独自のサブクラスを作成UITextFieldしています。

のデリゲート メソッドを引き続き機能させたいので、基本的にのデリゲート メソッドを次のようにラップUITextFieldする独自のプロトコルを作成しました。MyLabeledInputViewDelegateUITextField

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return [self.delegate inputViewShouldReturn:self];
}

そして、textField は自分のクラスのインスタンスのプロパティであるため、もちろん、次のようにデリゲートを設定します。

if (self.delegate) self.textField.delegate = self;

しかし、MyLabeledInputViewデリゲートを に設定して初期化するとnil、何らかの理由ですぐにクラッシュするようです。

これを正しく設定していますか、それとも何か不足していますか? どうもありがとうございました!

私の指定された初期化子はこれです:

- (id)initWithFrame:(CGRect)frame
      titleRelativeLength:(float)length
      titleText:(NSString *)text
      titleBackgroundColor:(UIColor *)color
      titleTextColor:(UIColor *)textColor
      textFieldBGColor:(UIColor *)textFieldBGColor
      textFieldTextColor:(UIColor *)textFieldTextColor
      delegate:(id<WRLabeledInputViewDelegate>)delegate;

実装はこれです:

- (id)initWithFrame:(CGRect)frame titleRelativeLength:(float)length titleText:(NSString *)text titleBackgroundColor:(UIColor *)color titleTextColor:(UIColor *)textColor textFieldBGColor:(UIColor *)textFieldBGColor textFieldTextColor:(UIColor *)textFieldTextColor
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.titleRelativeLength = length;
        self.title = text;
        self.titleBackgroundColor = color;
        self.titleTextColor = textColor;
        self.textFieldBackgroundColor = textFieldBGColor;
        self.textFieldTextColor = textFieldTextColor;
    }
    return self;
}

これは基本的に渡されたプロパティのみをキャプチャし、UITextField のデリゲートをlayoutSubviews自分のクラスのインスタンスに設定します。

4

2 に答える 2

2

間違ったオブジェクトでメソッドを呼び出そうとしているため、クラッシュの原因となっているデリゲートを設定するときに、いくつかの奇妙なことを試みているようです。ほとんどの場合、nil オブジェクトに対してメソッドを呼び出すと、単に nil が返されますが、このような場合 (ポインターが何かを指していると考えている場合だと思いますが、実際には間違った型のオブジェクトを指しています) )、受け取っているエラーが表示されます。

このようにする代わりに、サブクラスでデリゲートのセッターとゲッターをオーバーライドして、代わりに次のように textField のデリゲートを設定することをお勧めします。

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    self.textField.delegate = delegate;
}

- (id<UITextFieldDelegate>)delegate {
    return self.textField.delegate;
}

このように、サブクラスでデリゲートを処理したり、これら 2 つのメソッドを除いてそれらを処理したりすることについて心配する必要はありません。それらはすべて、textField とデリゲートによって自動的に処理されます。

于 2013-08-19T22:22:57.853 に答える