Ios 在文本字段中自动添加连字符,但无法编辑文本字段(电话号码屏蔽)

Ios 在文本字段中自动添加连字符,但无法编辑文本字段(电话号码屏蔽),ios,objective-c,uitextfield,phone-number,masking,Ios,Objective C,Uitextfield,Phone Number,Masking,使用下面的代码,我能够自动添加连字符,但不能正确地在文本字段中进行编辑 例如,当我单击在文本字段中已输入的数字之间插入任何数字时,这将在文本字段的末尾插入数字,并且不会正确删除该数字。有人能帮我吗 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(textField =

使用下面的代码,我能够自动添加连字符,但不能正确地在文本字段中进行编辑

例如,当我单击在文本字段中已输入的数字之间插入任何数字时,这将在文本字段的末尾插入数字,并且不会正确删除该数字。有人能帮我吗

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
  {    
     if(textField == txtUserName)
     {
         if (range.location == 12)
         {
             return NO;
         }
         if (range.length == 0 && ![[NSCharacterSet decimalDigitCharacterSet]   characterIsMember:[string characterAtIndex:0]])
         {
             return NO;
         }       
        if (range.length == 0 && (range.location == 3 || range.location == 7))
         {
             txtUserName.text = [NSString stringWithFormat:@"%@-  %@",txtUserName.text,string];
             return NO;
         }
         if (range.length == 1 &&(range.location==4 ||range.location ==7))      
         {
             range.location--;
             range.length = 2;
              txtUserName.text = [txtUserName.text  stringByReplacingCharactersInRange:range withString:@""];
             NSLog(@"Nisha..%@",txtUserName.text);
             return NO;
          }
    }   
    return YES;
}
  • 观察
    UITextFieldTextDidChangeNotification
    。受影响的文本字段存储在通知的对象参数中

  • 检查
    notification.object.text的文本格式
    如果需要,插入连字符


  • 当我们在
    UITextField
    中复制粘贴文本时,此代码也会起作用

    警告-此代码无法与键盘的删除按钮一起使用。无论如何,您只需要键盘的退格按钮,因为移动键盘的删除按钮与键盘的退格按钮类似

    注意-对您的
    UITextField
    使用
    tag
    ,而不是直接将
    textField
    与您的门店进行比较

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        //(textField == txtUserName)
        // don't compare with ID, use tag
        if(textField.tag == 0 ) 
        {
            NSString *text = textField.text;
            NSUInteger textLength = text.length;
            NSString *trimText = [text stringByReplacingOccurrencesOfString:@"-" withString:@""];
            NSUInteger trimTextLength = trimText.length;
    
            if (range.length == 0 && [string rangeOfCharacterFromSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
            {
                return NO;
            }
            if( string.length > 0 ) {
                NSString *replacedText = text;
                if(trimTextLength < 10) {
                    NSInteger remainingNumbers = (10-trimTextLength);
                    if(string.length > remainingNumbers) {
                        string = [string substringToIndex:remainingNumbers];
                    }
                    replacedText = [replacedText stringByReplacingCharactersInRange:range withString:string];
                }
                NSString *trimReplacedText = [replacedText stringByReplacingOccurrencesOfString:@"-" withString:@""];
                if( trimReplacedText.length > 3 ) {
                    trimReplacedText = [trimReplacedText stringByReplacingCharactersInRange:NSMakeRange(3, 0) withString:@"-"];
                }
                if( trimReplacedText.length > 7 ) {
                    trimReplacedText = [trimReplacedText stringByReplacingCharactersInRange:NSMakeRange(7, 0) withString:@"-"];
                }
                textField.text = trimReplacedText;
                return NO;
            }
            bool flag = false;
            if (range.length == 1 &&(range.location == 4 || (range.location == 7 && (textLength-trimTextLength)== 1 && [text rangeOfString:@"-"].location == 7) || (range.location == 8 && (textLength-trimTextLength)== 2) ))
            {
                range.location--;
                range.length = 2;
                flag = true;
            }
            else if (range.length >= 1)
            {
                flag = true;
            }
    
            if(flag) {
                NSString *replacedText = [textField.text stringByReplacingCharactersInRange:range withString:@""];
    
                NSString *trimReplacedText = [replacedText stringByReplacingOccurrencesOfString:@"-" withString:@""];
                if( trimReplacedText.length > 3 ) {
                    trimReplacedText = [trimReplacedText stringByReplacingCharactersInRange:NSMakeRange(3, 0) withString:@"-"];
                }
                if( trimReplacedText.length > 7 ) {
                    trimReplacedText = [trimReplacedText stringByReplacingCharactersInRange:NSMakeRange(7, 0) withString:@"-"];
                }
                textField.text = trimReplacedText;
                return NO;
            }
        }
        return YES;
    }
    
    -(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
    {
    //(textField==txtUserName)
    //不要与ID比较,使用标签
    如果(textField.tag==0)
    {
    NSString*text=textField.text;
    NSUTEGER textLength=text.length;
    NSString*trimText=[text STRINGBYREPLACINGOURCRENCESOFSTRING:@“-”和字符串:@“];
    NSU整数trimTextLength=trimText.length;
    if(range.length==0&&[string rangeOfCharacterFromSet:[[NSCharacterSet-decimalDigitCharacterSet]InversedSet].location!=NSNotFound)
    {
    返回否;
    }
    如果(string.length>0){
    NSString*replacedText=文本;
    如果(trimTextLength<10){
    NSInteger remainingNumbers=(10 trimTextLength);
    if(string.length>remainingNumbers){
    字符串=[string substringToIndex:remainingNumbers];
    }
    replacedText=[replacedText StringByReplacingCharactersRange:range with string:string];
    }
    NSString*trimReplacedText=[replacedText stringByReplacingOccurrencesOfString:@“-”带字符串:@“];
    如果(trimReplacedText.length>3){
    trimReplacedText=[trimReplacedText StringByReplacingCharactersRange:NSMakeRange(3,0),带字符串:@“-”];
    }
    如果(trimReplacedText.length>7){
    trimReplacedText=[trimReplacedText StringByReplacingCharactersRange:NSMakeRange(7,0),带字符串:@“-”];
    }
    textField.text=trimplacedtext;
    返回否;
    }
    布尔标志=假;
    如果(range.length==1&&(range.location==4 | | |(range.location==7&&(textLength trimmtextlength)==1&[text rangeOfString:@“-”]。location==7)|(range.location==8&(textLength trimmtextlength)==2)))
    {
    range.location--;
    range.length=2;
    flag=true;
    }
    否则如果(range.length>=1)
    {
    flag=true;
    }
    国际单项体育联合会(旗){
    NSString*replacedText=[textField.text stringByReplacingCharactersInRange:range with string:@'';
    NSString*trimReplacedText=[replacedText stringByReplacingOccurrencesOfString:@“-”带字符串:@“];
    如果(trimReplacedText.length>3){
    trimReplacedText=[trimReplacedText StringByReplacingCharactersRange:NSMakeRange(3,0),带字符串:@“-”];
    }
    如果(trimReplacedText.length>7){
    trimReplacedText=[trimReplacedText StringByReplacingCharactersRange:NSMakeRange(7,0),带字符串:@“-”];
    }
    textField.text=trimplacedtext;
    返回否;
    }
    }
    返回YES;
    }
    
    即使这个问题也太老了,但如果您需要帮助,可以使用VMaskTextField库


    您的问题不清楚??Sujay说了什么,我们不知道您的代码试图实现什么。最具体地说,您希望连字符显示在哪里以及何时显示?从您的代码中可以清楚地看出,您有相应的条件,但我们不知道这些条件是什么。连字符工作正常。。但是当我在做数字编辑时,那是行不通的。当我在数字中输入数字时,它就结束了。我希望在我的代码中进行编辑更正。但是这种重新格式化的“规则”是什么?请说明清楚。假设用户第一次输入的号码是123-456-7890。之后,他想将数字4更改为7,那么7位没有插入正确的位置。并且将超过10位数字的限制。我想解决这个问题。你能给我举个例子吗。如何实现你所说的。@Sujay……我又不能编辑数字了。这不能解决我的问题你在尝试什么,你是如何尝试的?”假设用户第一次输入数字,如123-456-7890。之后,他想将数字4更改为7,然后7位没有插入到正确的位置。并且将超过10位数字的限制。我想解决此问题。”这就是你想要的,对吧?我正在试着编辑他们写的号码。就像我第一次写“123-456-7890”莫布里号码一样。下一次我想,哦,4的位置是0。我怎么能编辑那个数字呢?是啊,那是ohkiee,你做的很好。但是我想让用户重新开始编辑数字,他可以编辑任何他想要的数字,而不仅仅是限制一个数字。但数量的限制不会被取消