【问题标题】:Limiting NSString to numbers as well as # if chars entered. (code included)将 NSString 限制为数字以及 # 如果输入的字符。 (包括代码)
【发布时间】:2011-12-03 00:04:08
【问题描述】:

我已经在网站上搜索了我的答案, 但是我认为这也是我陷入这个问题的原因。

我正在尝试将我的 1 个且唯一的文本字段限制为 10 个字符且仅包含数字。

以下是本网站上其他问题的代码。 我想要做的是将这段代码混合在一起以达到我的极限

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:filtered]; 
    return !([newString length] > 10);
}

在我单击文本字段之前,我的构建没有问题...但是我收到一个绿色箭头警告,指出“线程在断点 1 处停止” 我现在尝试了一些不同的东西,但现在觉得我很难过,我希望这对这里的人来说真的很容易......

他们将使用下面的代码单独(一个或另一个)工作,但我似乎无法让他们一起工作。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:string];
    return !([newString length] > 10);
}

这会将我的输入限制为 10 还有……

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];
}

这也将我的输入限制为仅没有问题的数字。 前提是我将 LEGAL 定义为仅数字...

我似乎无法让他们一起工作...... 谁能帮我解决这个问题???

【问题讨论】:

  • 设置 NSZombieEnable 以获得确切的异常。它将在控制台中向您显示详细的异常。请找出并发布例外情况。
  • 您遇到了断点。您说它停止并说“线程在断点 1 处停止”。删除断点(通过按 Command+6 很容易找到)或禁用断点。

标签: input nsstring uitextfield limit


【解决方案1】:

有很多方法可以做到这一点,但我认为这可能是最容易理解的:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    // Check for non-numeric characters
    NSUInteger lengthOfString = string.length;
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
        unichar character = [string characterAtIndex:loopIndex];
        if (character < 48) return NO; // 48 unichar for 0
        if (character > 57) return NO; // 57 unichar for 9
    }
    // Check for total length
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
    if (proposedNewLength > 10) return NO;
    return YES;
}

第一部分本质上检查一个非空字符串是否有不在 '0' 和 '9' 之间的字符,如果它在新字符串中的任何位置找到它拒绝编辑。第二个确定编辑完成后文本的长度,如果它太高则与 10 进行比较,它会拒绝编辑。如果函数通过了所有这些测试,则允许编辑。

在我点击我的文本字段之前,我的构建没有问题......但是 我收到一条绿色箭头警告,说明 " thread stopped at breakpoint 1 "

您显然在textField:shouldChangeCharactersInRange:replacementString: 方法中设置了一个断点。如果您不熟悉断点,它们看起来像这样:(行号列上的蓝色箭头)您可以使用右图所示的按钮切换是否启用它们:

断点非常好用,建议大家学会使用。但现在只需单击断点并将其从列中拖动,就像停靠栏中的图标一样,或者关闭该选项。

【讨论】:

  • 现在我看到它似乎很简单……但我永远不会那样做。我希望我能投票!它工作得很好,我正在阅读断点。谢谢!
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2014-01-25
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多