2012-08-30 84 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;