2012-08-30 55 views
1

我有一个uitextfield子类,并在init方法和setDelegate我有这样的:定制的UITextField委托

- (void) setDelegate:(id<UITextFieldDelegate>)paramDelegate{ 
    [super setDelegate:paramDelegate]; 

    MRAAdvancedTextFieldDelegate *limitedDelegate = [[MRAAdvancedTextFieldDelegate alloc] init]; 
    self.delegate = limitedDelegate; 
} 

我使用ARC,但是这导致BAD_ACCESS。有任何想法吗?

+0

我给了以下的答案,但实际上意识到我有点困惑,你要在这里完成的。你是否有两个独立的代表?或者扩展UITextFieldDelegate协议? –

回答

0

您在setDelegate:方法中写入self.delegate = limitedDelgate。这与拨打[self setDelegate:limiatedDelegate]完全相同。由于您处于-setDelegate:方法本身之内,因此导致了infitine递归。希望这可以帮助!

编辑:根据您的了解你的意图评论,覆盖它是这样的:

- (void) setDelegate:(id<UITextFieldDelegate>)paramDelegate{ 
    MRAAdvancedTextFieldDelegate *limitedDelegate = [[MRAAdvancedTextFieldDelegate alloc] init]; 
    [super setDelegate:limitedDelegate]; 
} 

但我不认为这是一个好主意,这样做 - 你应该有你的客户端代码传中的情况下,你的代替。

+0

谢谢,但我如何确保当我在视图控制器中执行someTextField.delegate时,它不会设置? –

+0

@MarioPen在你的问题上看到我的评论。为了提出进一步的解决方案,我需要更多地了解你想要做的事情。 –

+0

我希望所有委托方法只能由给定的类来处理,因此我不想为该字段设置委托。因此,我为什么压倒二传手。 –

0
self.delegate = limitedDelegate; 

是由编译器变成

[self setDelegate:limitedDelegate]; 

,导致无限循环。解决方案:而不是使用属性,使用实例变量,而不是定制的setter方法:

delegate = limitedDelegate;