【问题标题】:Custom UITextField delegate set to self initiates infinite loop自定义 UITextField 委托设置为自启动无限循环
【发布时间】:2014-11-12 13:22:28
【问题描述】:

我正在编写需要自定义 UITextField 类的 iPhone 应用程序。对于我的文本字段,我需要缩进,文本之前的图像和最大字符。出于这个原因,我创建了基于 UITextField 的自定义类。我所有的文本字段都将基于这个新类。我使用 Google 并搜索了 Stackoverflow,发现在像我这样的情况下,我必须在 init 期间使用 self.delegate = self;,所以我不需要在我的 View Controller 类中实现 textFieldShouldBeginEditingtextFieldShouldEndEditing 之类的方法。我所有的文本字段都将在情节提要中创建,所以initWithCoder。结果,我在输入 1、2 或 3 个符号后收到无限循环和应用程序崩溃(我此时使用模拟器)。有趣的是,数字键盘或密码键盘没有这样的问题。此外,如果我在 Mac 键盘上而不是在模拟器上键入符号,也没有问题。我试图调试,但在崩溃期间它直接跳入循环并存在错误。 如何克服这个问题?

附:我在收到无限循环时询问question,并且有self.delegate = self; 可能导致这种循环的cmets,但我看到这个语句被广泛使用。可能是我没有正确执行此操作,但我无法弄清楚如何从 UITextField 中制作可重用的类。

编辑: 这是我的代码:

在初始化时,我初始化并设置边框颜色:

- (id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {

        self.layer.borderColor=[[UIColor blackColor] CGColor];
        self.delegate = self;
    }
    return self;
}

当我开始编辑时,我更改边框颜色并设置缩进(缩进集将在属性设置器中移动):

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    // Change border of text field that is editing to orange
    textField.layer.masksToBounds=YES;
    textField.layer.borderColor=[[UIColor orangeColor] CGColor];
    textField.layer.borderWidth= 1.0f;

    UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _leftIndent, 10)];
    [self setLeftViewMode:UITextFieldViewModeAlways];
    [self setLeftView:spacerView];

    return YES;
}

完成编辑后,我返回颜色:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

    // Change border of text field that is edited to black
    textField.layer.masksToBounds=YES;
    textField.layer.borderColor=[[UIColor blackColor] CGColor];
    textField.layer.borderWidth= 1.0f;

    return YES;
}

在值更改时,我会检查最大字符数:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    // Restrict number of symbols in text field to "maxSymbols"
    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= (int)_maxSymbols || returnKey;
}

【问题讨论】:

  • 你能在这里发布你的 textFieldShouldBeginEditing 和 textFieldShouldEndEditing 方法吗?
  • 你解决了吗?我没有看到任何明显的东西。尝试找出代码的哪一行导致了无限循环。
  • 不,一般。当我在文本字段中调试并传递 1 或 2 个符号时,它会启动无限循环并崩溃。
  • 嗯...我尝试了您的示例,似乎 self.delegate = self 无法在 UITextField 上工作。 A 搜索了一下,似乎无限循环是由于实现了 respondsToSelector: 的方式。最终,它尝试在它的委托上调用 respondsToSelector 并最终一次又一次地调用 [self respondsToSelector:]。
  • 您可以尝试寻找解决方法,但是,如果您坚持避免使用外部委托,您可以在 UITextField 子类实现中创建一个私有类来执行委托。

标签: ios objective-c iphone ios7 uitextfielddelegate


【解决方案1】:

我不知道这是否是实际的答案,但我有办法解决我的下一个问题How properly subclass UITextField in iOS?(来自justafinger)的答案。我没有在我的自定义控件中分配self.delegate = self;,但我有从视图控制器中的委托调用的方法。

我希望这可以帮助遇到像我这样的问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多