shouldChangeCharactersInRange 未从继承自 UITextField 的 class 调用

shouldChangeCharactersInRange not called from class inheriting from UITextField

我知道有关于 shouldChangeCharactersInRange 的帖子,但其中 none 是针对我的问题的。所以这就是我正在努力解决的问题。我有一个继承自 UITextField 的 class 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;
}

我没有想法,我真的需要这个方法来工作。我正在使用 xcode 6.4 目标 ios7.0+。预先感谢您的时间和帮助。

理想情况下,您不希望将 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

我猜其他人会在你这样做之后将自己设置为委托人,从而将委托消息从你那里拉走。