2012-08-30 2 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

Вы пишете self.delegate = limitedDelgate в своем методе setDelegate:. Это точно так же, как вызов [self setDelegate:limiatedDelegate]. Поскольку вы находитесь в самом методе -setDelegate:, вы вызываете рекурсию infitine. Надеюсь это поможет!

EDIT: на ваш комментарий о своем намерении, заменить его следующим образом:

- (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]; 

компилятором, в результате чего в бесконечном цикле. Решение: вместо того, чтобы использовать свойство, используйте переменный экземпляр вместо этого в методе пользовательских сеттеров:

delegate = limitedDelegate; 
Смежные вопросы