0

注: この質問を投稿したので、ここは夜です。コメントや回答に返信していない場合は、午前中に行います。ご理解いただきありがとうございます:-)

アイデアは、ユーザーが各 UIButton に触れたときに UILabel を電話番号 (米国形式) としてフォーマットすることです。

キーパッド レイアウトがあり、ユーザーが各数字キーに触れると、ラベルが表示され、その場で結果の文字列が書式設定されます。私はあまり誇りに思っていないコードを書きました。誰かがこれをより良い方法または別のアプローチで行うのを手伝ってくれることを願っています.

画面

画像は、それがどのように見えるかについての公正なアイデアを提供する必要があります. さて、ロジックに取り掛かります:

以下のコードでは、keyOne は UILabel に数字を追加するための IBAction であり、keyBack はそれを削除するためのものです。

電話番号を入力する方法は次のとおりです。

1234567890 と入力すると:

after 1,2,3 the label is modified as 123- and gets assigned to string
Now string will be 123- and I continue touching 4567890

after 123-4567, when I touch 8, label is modified as (123)456-78 and gets assigned to string
Now string will be (123)456-7890

If I wish, I could continue entering more numbers. 
As per requirement, the number should lose its formatting. 
i.e. After (123)456-7890 if I press 1, it should become 12345678901

ここでのコツは、まったく同じ方法でステップを元に戻すことです。お漬物はこちら。1234567890 だけを入力した場合、_phoneNumber.text は (123)456-7890 になり、3 回押すと 123-4567 になります。次に、4 回押すと 123 になります。

ただし、12345678901 を入力すると、_phoneNumber.text は (123)456-7890 になり、フォーマットが失われて 12345678901 になり、もう一度押すと (123)456-7890 などになります。

シングル ビュー アプリケーション タイプの新しいプロジェクトを作成し、以下のものを貼り付けると (もちろん、ボタンを作成し、0 ~ 9 を keyOne に接続し、keyBack に戻した後)、正常に動作することがわかります。しかし、上で述べたように、私はあまり自慢できないコードを書きました。これを行うには、もっと簡単な方法が必要だと思います。

ViewController.h

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *lengthParam;
@property (weak, nonatomic) IBOutlet UILabel *phoneNumber;
- (IBAction)keyOne:(id)sender;
- (IBAction)keyBack:(id)sender;
- (IBAction)clearAll:(id)sender;
@end

ViewController.m

#import "ViewController.h"

@interface ViewController () {
    BOOL isReformatted;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (IBAction)keyOne:(id)sender {
    UIButton *btn = (UIButton *)sender;
    NSString *str = [NSString stringWithString:self.phoneNumber.text];
    str = [str stringByAppendingString:btn.titleLabel.text];
    self.phoneNumber.text = str;
    if(str.length==4) self.phoneNumber.text = [self insertMinus:str]; //before the 4th number, insert '-' as a first step
    if(str.length==9) self.phoneNumber.text = [self insertParenthesis:str]; //remove - before the 4th number, encapsulate first 3 numbers inside () and add - at end of current number
    if(str.length>13) self.phoneNumber.text = [self plainFormat:str]; //if user enter more than 10 numbers, remove formatting
    self.lengthParam.text = [NSString stringWithFormat:@"%d",self.phoneNumber.text.length];
}

- (IBAction)keyBack:(id)sender {
    NSString *str = [NSString stringWithString:self.phoneNumber.text];
    NSString *newStr = nil;
    if(str.length>0) { //check for empty string
        if(str.length>11 && isReformatted==NO) newStr = [str substringToIndex:str.length-1]; //string.length > 10 which means plainFormat was called earlier and reFormat isn't called yet
        else if(str.length==11 && isReformatted == NO) { //string length is now 11
            if([str characterAtIndex:0]!='(') newStr = [self reFormat:str]; //if entered string is 12345678901, it is not reFormatted. remove last 1 and reFormat it as (123)456-7890
            else newStr = [self removeParenthesis:str]; //entered string itself is (123)456-78 so transform it as 123-4567
        } else { //we are dealing with a reformatted string of length 11 now.
            newStr = [str substringToIndex:str.length-1]; //String is (123)456-78, remove 8 and apply one of the below rules
            if(newStr.length==10) { //transform (123)456-7 as 123-4567
                newStr = [str substringToIndex:str.length-1];
                newStr = [self removeParenthesis:str];
            }
            if(newStr.length==4&&[newStr characterAtIndex:3]=='-') newStr = [self removeMinus:str]; //transform 123-4 to 123
        }
        self.phoneNumber.text = newStr;
        self.lengthParam.text = [NSString stringWithFormat:@"%d",self.phoneNumber.text.length];
    }
}

- (IBAction)clearAll:(id)sender {
    self.phoneNumber.text = @"";
    self.lengthParam.text = [NSString stringWithFormat:@"%d",self.phoneNumber.text.length];
}

- (NSString *)insertMinus:(NSString *)str {
    return [NSString stringWithFormat:@"%@-%@",[str substringToIndex:3],[str substringFromIndex:3]];
}

- (NSString *)insertParenthesis:(NSString *)str {
    NSString *c1 = [NSString stringWithFormat:@"(%@)",[str substringToIndex:3]];
    NSString *c2 = [NSString stringWithFormat:@"%@-%@",[str substringWithRange:NSMakeRange(4, 3)],[str substringFromIndex:7]];
    return [NSString stringWithFormat:@"%@%@",c1,c2];
}

- (NSString *)plainFormat:(NSString *)str {
    isReformatted = NO;
    str = [str stringByReplacingOccurrencesOfString:@"(" withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@")" withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@"-" withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    return str;
}

- (NSString *)reFormat:(NSString *)str {
    isReformatted = YES;
    NSString *c1 = [NSString stringWithFormat:@"(%@)",[str substringToIndex:3]];
    NSString *c2 = [NSString stringWithFormat:@"%@-%@",[str substringWithRange:NSMakeRange(3, 3)],[str substringWithRange:NSMakeRange(6, 4)]];
    return [NSString stringWithFormat:@"%@%@",c1,c2];
}

- (NSString *)removeParenthesis:(NSString *)str {
    str = [self plainFormat:str];
    NSString *newStr = [NSString stringWithFormat:@"%@-%@",[str substringToIndex:3],[str substringWithRange:NSMakeRange(3, 4)]];
    return newStr;
}

- (NSString *)removeMinus:(NSString *)str {
    str = [self plainFormat:str];
    NSString *newStr = [NSString stringWithFormat:@"%@",[str substringToIndex:3]];
    return newStr;
}

@end
4

1 に答える 1