Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 不应从继承自UITextField的类调用ShouldChangeCharactersRange_Ios_Objective C_Uitextfield_Uitextfielddelegate - Fatal编程技术网

Ios 不应从继承自UITextField的类调用ShouldChangeCharactersRange

Ios 不应从继承自UITextField的类调用ShouldChangeCharactersRange,ios,objective-c,uitextfield,uitextfielddelegate,Ios,Objective C,Uitextfield,Uitextfielddelegate,我知道有些帖子是关于范围内的shouldChangeCharacters的,但没有一篇针对我的问题。这就是我正在努力解决的问题。我有一个从UITextField继承的类kMoneyTextField。我想先解析用户键入的每个字符,然后再将其打印到TextField中。不幸的是,我的shouldchangeCharactersRange方法没有被调用-从不 kMoneyTextField.h @interface kMoneyTextField : UITextField <UITextFi

我知道有些帖子是关于范围内的shouldChangeCharacters的,但没有一篇针对我的问题。这就是我正在努力解决的问题。我有一个从UITextField继承的类kMoneyTextField。我想先解析用户键入的每个字符,然后再将其打印到TextField中。不幸的是,我的shouldchangeCharactersRange方法没有被调用-从不

kMoneyTextField.h

@interface kMoneyTextField : UITextField <UITextFieldDelegate>
@end

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

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

我猜,在您这样做之后,其他人正在将自己设置为代理,从而将代理消息从您身边拖走。

initWithCoder:是否被调用过?记录下来,看看。。。如果不是,则永远不会设置委托,这将解释为什么不调用委托方法。是的,之所以调用它,是因为我还在那里设置了一些其他参数,并订阅了工作正常的事件。顺便问一下,什么是真的?您真的应该在这里返回YES或NO。我的坏消息将解决这个问题:最后,我还有一个建议:实现awakeFromNib并将委托设置在那里。在初始值设定项中调用setter是一种卑鄙的行为。但是在awakeFromNib中调用setter没有什么错。不要忘记在awakeFromNib中调用super。理想情况下,您不希望将UITextField的子类指定为它自己的委托。不,这样做没有错。你不是在解释OP看到的问题,你只是给出了一种不同的建议,这种建议是错误的。@matt,当然你可以指定UITextFields的一个子类作为它的委托,OP继续声明他们没有得到回调-我相信这是因为另一个对象正在将自己设置为委托,从而窃取这些回调。另一种方法是使用通知获取与代理回调相同的信息。@matt我已更新了开场白,以更好地阐明我的意图-我注意到您已将其包含在对该问题的回答中我并非有意窃取您的答案!我一点也不明白你在暗示这就是正在发生的事情。让我们看看OP是否证实了这一点。你应该把答案写得更清楚些。很难在你的答案中找到我的答案!而且你的答案仍然充满了虚假信息。您永远不应该从initcoder.调用initframe:。我也有同样的问题,但是正在调用UITextFieldDelegate中的其他方法,除了shouldChangeCharactersInRange:。有什么想法吗?
- (instancetype)initWithFrame:(CGRect)frame