ios - 文本字段应该更改范围内的字符,只有第一个正在执行

标签 ios objective-c cocoa-touch uitextfield

任何人都可以帮助我使用文本字段的以下代码应该仅在第一个正在执行的范围内更改字符吗?

#define ACCEPTABLE_CHARACTERS1 @" 1234567890"

- (BOOL)textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range
                replacementString:(NSString *)string 
{
    // first one................//
    if (textField == self.phoneField)
    {
        NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS1] invertedSet];

        NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

        return [string isEqualToString:filtered];
    }

    // second one ........                  
    if (textField == self.phoneField) {

        if (((range.location == 3)) ||( range.location == 7)) {

            _phoneField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];

             return NO;
        }
        else  if (range.length == 1 &&
                  (range.location == 4 || range.location == 8))  {
             range.location--;
             range.length = 2;
             textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];

             return NO;
        }

        if (range.length+range.location > textField.text.length) {
             return NO;
        }

        NSUInteger newLength = [textField.text length] + [string length] - range.length;

        return  newLength <=10;
    }
}

最佳答案

因为您在第一个 if block 中返回函数值,所以不会执行第二个 if block ,return 语句立即结束执行当前函数的参数,返回它的参数作为函数调用的值。

要为您的 textField 格式化数字,请这样做

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

    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890"] invertedSet];

    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

    if (![string isEqualToString:filtered]) {
        return NO;
    }
    if (((range.location == 3)) ||( range.location == 7))
    {

        textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
        return NO;
    }
    else  if (range.length == 1 &&
              (range.location == 4 || range.location == 8))  {
        range.location--;
        range.length = 2;
        textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];

        return NO;
    }

    if (range.length+range.location > textField.text.length) {
        return NO;
    }
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return  newLength <=12;
}

关于ios - 文本字段应该更改范围内的字符,只有第一个正在执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38789292/

相关文章:

objective-c - 使带有透明标题栏的 NSWindow 部分不可移动

objective-c - 在 iOS 中设置 UICollectionView

ios - 在 UIImageView 上绘制一个简单的圆圈

ios - 完善 UICollectionView 布局转换中的 subview 大小调整

ios - Swift等效于NSDictionary initWithObjects:ForKeys

ios - 在没有 Segues 的 ViewController 之间传递数据

ios - UIStackView 和 Fill Distribution - 不尊重内容拥抱优先级

ios - 在 StoryBoard TabBar 上设置托管对象上下文 - 具有嵌入式导航 Controller 的 TableView Controller

ios - 向现有 UIView 添加非事件约束

iphone - 在 UIWebView 中点击以隐藏键盘