2015-07-27 3 views
0

Я знаю, что есть сообщения, касающиеся shouldChangeCharactersInRange, но ни одна из них не касается моей проблемы. Так это то, с чем я борюсь. У меня есть класс kMoneyTextField, который наследуется от UITextField. Я хочу разобрать каждый символ, введенный пользователем, прежде чем печатать его внутри TextField. К сожалению, мой метод shouldChangeCharactersInRange не вызывается - НИКОГДА!shouldChangeCharactersInRange не вызывается из класса, наследующего от UITextField

kMoneyTextField.h

@interface kMoneyTextField : UITextField <UITextFieldDelegate> 
@end 

kMoneyTextField.m

@implementation kMoneyTextField 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) {   
     [self setDelegate:self]; 
    } 
    return self; 
} 

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    // WHY NOBODY CALLS ME?!? 
    return YES; 
} 

Я из идей, и я действительно нужен этот метод работать. Я работаю с xcode 6.4, ориентированным на ios7.0 +. Заранее благодарим за ваше время и помощь.

+1

Является ли 'initWithCoder:' когда-либо вызываемым? Запишите его и посмотрите ... Если это не так, вы никогда не устанавливаете делегата, что объясняет, почему методы делегата не вызываются. – matt

+0

Да, это называется, потому что я также установил там некоторые другие параметры и подписался на события, которые работают очень хорошо. –

+0

Кстати, что такое 'TRUE'? Вы действительно должны возвращать «ДА» или «НЕТ» здесь. – matt

ответ

0

Я собираюсь предположить, что кто-то выставляя себя в качестве делегата после вы это делаете, тем самым вытягивая делегат сообщение от вас.

+0

У меня такая же проблема, но другие методы из 'UITextFieldDelegate' получаются вызываемыми, за исключением' shouldChangeCharactersInRange: '. Есть идеи? –

-1

В идеале вы не хотите назначать подкласс UITextField своим собственным делегатом, поскольку это предотвращает возможность того, что этот подкласс может назначить себя в качестве делегата (или если это произойдет, это приведет к неожиданному поведению). К счастью, UITextField имеет большой набор уведомлений, которые вы можете подключить, чтобы имитировать обратные вызовы делегатов.

Так, чтобы ответить на ваш вопрос, я хотел бы использовать что-то вроде этого:

#pragma mark - Init 

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 

    if (self) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(textChanged:) 
                name:UITextFieldTextDidChangeNotification 
                object:self]; 
    } 

    return self; 
} 

#pragma mark - Notifications 

- (void)textChanged:(NSNotification *)notification 
{ 
//Do what needs to be done here 
} 

#pragma mark - MemoryManagement 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

Важно отметить, что в Objective-C есть условность, имеющие назначенный инициализатор, который Инициализаторы трубы, для UITextField Я считаю, это:

- (instancetype)initWithFrame:(CGRect)frame 
+0

«В идеале вы не хотите, чтобы подкласс класса UITextField был его собственным делегатом» Нет, нет ничего плохого в этом.Вы не объясняете проблему, которую видит OP, вы просто даете другой совет (и этот совет неверен). – matt

+0

@matt, в то время как вы, конечно же, можете назначить подкласс UITextFields, поскольку он является делегатом, OP продолжает утверждать, что они не получают обратные вызовы - я считаю, что это потому, что другой объект затем устанавливает себя делегатом, поэтому «краду «эти обратные вызовы. Одной из альтернатив этому является использование уведомлений для получения той же информации, что и обратный вызов делегата. – williamb

+0

@matt Я обновил вступительное заявление, чтобы лучше прояснить мои намерения - что я заметил, что вы включили в ответ на этот вопрос – williamb

Смежные вопросы