【问题标题】:How to prevent user not to remove particular character in UITextField?如何防止用户不删除 UITextField 中的特定字符?
【发布时间】:2015-10-12 09:59:13
【问题描述】:

在我的 iPhone 应用程序中,我希望 UITextField 默认具有“+”符号作为手机号码。如果用户想更改手机号码,那么他/她可以。但他们不允许从 UITextField 中删除“+”。 “+”符号在 UITextField 中始终保持原样。

例如:-

+911234567890 - 正确号码

911234567890 - 号码错误。 + 是必需的。

我尝试了 UITextField 委托方法

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

并且还使用了通知“UIControlEventEditingChanged”。

提前致谢。

【问题讨论】:

  • textField 支持leftView。添加带有+符号的imageView作为UIImage。或者我们也可以使用 textField shouldChangeCharactersInRange 方法。
  • 我已经尝试过 shouldChangeCharactersInRange 方法,但没有任何运气
  • 你用shouldChangeCharactersInRange做了什么?
  • - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField.text isEqualToString:@"+"]) { return NO ; } 返回是;如果用户想尝试删除“+”,那么他们不能。但这会产生问题,因为字符方法应该考虑前一个字符。表示如果用户删除字符并到达“+”,并且在该用户尝试写入任何字符之后,则此方法不允许他们写入。

标签: ios objective-c iphone notifications uitextfield


【解决方案1】:

试试这个。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString *head= [textField.text substringToIndex:range.location];
NSString *tail= [textField.text substringFromIndex:range.location];
NSString *phoneNumber = [NSString stringWithFormat:@"%@%@%@",head,string,tail];
if ([string isEqualToString:@""]) {
    NSString *deleteString = [tail substringToIndex:1];
    if ([deleteString isEqualToString:@"+"]) {
        return NO;
    }
}else if(![self isValidPhoneNumber:phoneNumber]){
    return NO;
}
return YES;
}

通过正则表达式检查有效的电话号码

-(BOOL)isValidPhoneNumber:(NSString*)phoneNumber{
NSString *phoneNumberPattern = @"[+]([0-9])*";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneNumberPattern];

BOOL match = [predicate evaluateWithObject:phoneNumber];
if (match) {
    NSLog(@"VALID");
    return YES;
}else{
    NSLog(@"INVALID");
}
return NO;
}

【讨论】:

  • IMO,检查范围更好,因为它可以防止任何第一个字符被删除(更容易支持您的代码+可重用)。您还可以使用上述代码在加号之前添加任何字符。在下面添加了基于范围检查的答案。
  • @DaniilKorotin,你是对的。但我确实想要“+”所以我需要用字符串检查。所以,上面的代码在我的情况下运行良好:)。
  • 现在尝试将光标移动到“+”号之前。您可以输入任何内容,也可以删除加号。
  • 您想防止在 + 号之前输入任何内容吗?
【解决方案2】:

防止在第一个字符之前添加任何字符:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    return range.location == 0 && (range.length == 0 || range.length == 1) ? NO : YES;
}

【讨论】:

    【解决方案3】:

    试试这个。在这里,我使用 UITextField 的左填充。 txtf 是我的 UITextField。

    UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(5, 0, 15, 30)];
    lbl.textAlignment=NSTextAlignmentCenter;
    [lbl setText:@"+"];
    _txtf.leftView=lbl;
    [_txtf setLeftViewMode:UITextFieldViewModeAlways];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多