iOS会自动在文本字段中添加连字符

123*_*123 6 objective-c hyphen ios

我正在学习iOS开发,并且很难搞清楚控件的各种事件.对于测试,我有一个UITextField,用户打算输入以下格式的字符串:XXXX-XXXX-XXXX-XXXX

我希望能够检查每个条目后字段中的文本有多长,并查看是否需要在其后附加连字符.我为此设置了我的IBAction功能但是当我将它分配给"Value Changed"事件时它什么也没做,当我在"Editing Did End"上设置它时它工作正常,但只有在用户退出时才会调用控制.

编辑:只是要添加,"编辑已更改"事件也会导致崩溃.我假设这是一个堆栈溢出或文本设置再次调用事件处理程序的东西.

简而言之,有没有办法在用户每次在UITextField中输入字符时设置事件处理程序?

din*_*sky 35

请注意,之前的答案严重不足.天堂禁止用户输入错误的数字,敢于尝试删除它!公平地说,海报注意到代码可能无法完美运行.但是,它甚至不会编译,所以买家当心过滤器应该已经很高了.如果你修复了编译错误并尝试了代码,你会发现你很容易得到与海报规定格式不符的输入.

这是我用于将文本字段限制为格式为123-456-7890的电话号码的解决方案.调整其他数字格式是微不足道的.注意使用传递的NSRange.而且,即使使用数字虚拟键盘,也需要拒绝非数字字符,因为用户仍然可以通过硬件键盘输入非数字.

另一个说明.我在第4和第7位数字输入添加连字符,以便更容易删除数字.如果在第3和第6位后添加,则必须处理删除悬空连字符的情况.下面的代码避免了这个用例.

// Restrict entry to format 123-456-7890
- (BOOL)                textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range
                replacementString:(NSString *)string {

  // All digits entered
  if (range.location == 12) {
    return NO;
  }

  // Reject appending non-digit characters
  if (range.length == 0 &&
       ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
    return NO;
  }

  // Auto-add hyphen before appending 4rd or 7th digit
  if (range.length == 0 &&
      (range.location == 3 || range.location == 7)) {
    textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
    return NO;
  }

  // Delete hyphen when deleting its trailing digit 
  if (range.length == 1 &&
      (range.location == 4 || range.location == 8))  {
    range.location--;
    range.length = 2;
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
    return NO;
  }

  return YES;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常好的代码.经过一个小时的努力实现这一点后,我感到难过,然后我找到了你的解决方案.谢谢! (3认同)

小智 6

dingo sky的答案很好,但是在帮助未来遇到这个解决方案的人们的兴趣中,有一些问题.Dingo的解决方案允许您将长数字字符串粘贴到破坏委托"规则"的字段中,因为它仅使用范围位置进行格式化和长度.(你可以有超过12个字符,没有连字符).

简单的解决方案是计算结果字符串的长度,并每次重新格式化.

Dingo答案的更新版本如下:

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

    //calculate new length
     NSInteger moddedLength = textField.text.length-(range.length-string.length);

    // max size.
    if (moddedLength >= 13) {
        return NO;
    }

    // Reject non-number characters
    if (range.length == 0 &&![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
        return NO;
    }

    // Auto-add hyphen before appending 4rd or 7th digit
    if ([self range:range ContainsLocation:3] || [self range:range ContainsLocation:7]) {
        textField.text = [self formatPhoneString:[textField.text stringByReplacingCharactersInRange:range withString:string]];
        return NO;
    }

    return YES;
}

#pragma mark helpers

-(NSString*) formatPhoneString:(NSString*) preFormatted
{
    //delegate only allows numbers to be entered, so '-' is the only non-legal char.
    NSString* workingString = [preFormatted stringByReplacingOccurrencesOfString:@"-" withString:@""];

    //insert first '-'
    if(workingString.length > 3)
    {
        workingString = [workingString stringByReplacingCharactersInRange:NSMakeRange(3, 0) withString:@"-"];
    }

    //insert second '-'
    if(workingString.length > 7)
    {
        workingString = [workingString stringByReplacingCharactersInRange:NSMakeRange(7, 0) withString:@"-"];
    }

    return workingString;

}

-(bool) range:(NSRange) range ContainsLocation:(NSInteger) location
{
    if(range.location <= location && range.location+range.length >= location)
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*hol 5

对于这样的事情,我建议使用UITextFieldDelegate来检测用户何时键入新字符.设置文本字段的委托如下:

[textField setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

然后,根据需要实现委托方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder]; // hide the keyboard
    return NO;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // every time the length reaches four, it gets reset to 0 and a '-' is added.
    static int currentLength = 0;
    if ((currentLength += [string length]) == 4) {
        currentLength = 0;
        [textField setText:[NSString stringWithFormat:@"%@%@%c", [textField text], string, '-'];
        return NO;
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

这可能不会完美,但我希望它有所帮助!