1

我正在创建自己的子类,它基本上是一个UIView包含 aUILabel和 a的子类UITextField

所以我仍然希望 的委托方法UITextField起作用,所以我创建了自己的称为协议的协议MyLabeledInputViewDelegate,它基本上UITextField以这种方式包装了 的委托方法:

-(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,但在这种情况下(我相信是指针认为它指向某个东西,但实际上它指向的是错误类型的对象),它会给你你收到的错误。

我建议不要这样做,而是在子类中覆盖委托的 setter 和 getter 来设置 textField 的委托,例如:

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

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

这样,除了这两种方法之外,您不必担心处理子类中的委托或处理它们;它们都将由 textField 和委托自动处理。

于 2013-08-19T22:22:57.853 回答
1

好的,我现在明白了,您错过了在实现中添加参数。添加它,你会很高兴的。和self.delegate = delegate;

编辑:

您应该在任何包装的委托调用上执行此操作,(或任何时候您创建自己的协议)

if ([self.delegate respondsToSelector:@selector(inputViewShouldReturn:)]) {
    [self.delegate inputShouldReturn:self];
}

如果您没有在侦听类中实现该委托方法,除非您询问对象是否首先响应,否则您将遇到崩溃。

于 2013-08-19T22:34:31.630 回答