我知道有关于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。提前感谢您的时间和帮助。
答案 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