我自己的子类的委托方法绕过UITextField的委托方法正在崩溃我的应用程序

时间:2013-08-19 22:16:17

标签: objective-c

我正在创建自己的子类,它基本上是UIView的子类,其中包含UILabelUITextField

所以我仍然希望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;
}

这基本上只捕获传入的属性,然后我将layoutSubviews中的UITextField的委托设置为我自己的类的实例。

2 个答案:

答案 0 :(得分:2)

在设置导致它崩溃的委托时,看起来你正在尝试一些奇怪的事情,因为你试图在错误的对象上调用方法。大多数情况下,当你在一个nil对象上调用一个方法时,它只返回nil,但是在这种情况下(我相信当指针认为它指向某个东西时,它实际上指的是错误类型的对象) ),它会给你错误的信息。

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

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

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

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

答案 1 :(得分:1)

好的,我现在看到,你错过了为你的实现添加一个参数。添加它,你会很高兴。并self.delegate = delegate;

编辑:

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

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

如果你没有在你的监听类中实现那个委托方法,除非你问对象是否首先响应,否则你会崩溃。