shouldChangeCharactersInRange没有从继承自UITextField的类调用

时间:2015-07-27 16:45:44

标签: ios objective-c uitextfield uitextfielddelegate

我知道有关于shouldChangeCharactersInRange的帖子,但没有一个针对我的问题。所以这就是我正在努力的方向。我有一个继承自UITextField的类kMoneyTextField。在TextField中打印之前,我想解析用户输入的每个字符。不幸的是,我的shouldChangeCharactersInRange方法没有被调用 - 从来没有!

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;
}

我没有想法,我真的需要这种方法才能工作。我正在使用针对ios7.0 +的xcode 6.4。提前感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

我猜测其他人在你做完之后将自己设置为代表,从而将代理信息拉离你。

答案 1 :(得分:-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