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
我猜其他人会在你这样做之后将自己设置为委托人,从而将委托消息从你那里拉走。
我知道有关于 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
我猜其他人会在你这样做之后将自己设置为委托人,从而将委托消息从你那里拉走。