我正在创建自己的子类,它基本上是UIView
的子类,其中包含UILabel
和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;
}
这基本上只捕获传入的属性,然后我将layoutSubviews
中的UITextField的委托设置为我自己的类的实例。
答案 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];
}
如果你没有在你的监听类中实现那个委托方法,除非你问对象是否首先响应,否则你会崩溃。