トップ «前の日記(2012-08-08) 最新 次の日記(2012-08-13)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2012-08-12 [iOS]入力制限

たとえば、テキスト・フィールドの場合。
OSXでは、InterfaceBuilderでテキストフィールドのフォーマッタを設定して、ユーザが入力できる値の形式を指定できる。

iOSでもNSFormatterは存在しているが、ビューの仕組みが違う為か、InterfaceBuilderで入力できる値の形式を指定できない。

そこで、NSFormatterを利用するが、別の方法で入力値の制限方法を試してみることにする。

どので入力値の制限を行うかは、テキストフィールドの場合、UITextFieldのデリゲートUITextFieldDelegateで用意されているメソッドによる事になる。

  • – textFieldShouldBeginEditing:
    編集開始の直前に呼ばれる。NOを返すと編集は開始しない。
  • – textFieldDidBeginEditing:
    編集開始の直後に呼ばれる。
  • – textFieldShouldEndEditing:
    編集終了の直前に呼ばれる。NOを返すと編集は終了しない。
  • – textFieldDidEndEditing:
    編集終了の直後に呼ばれる。
  • – textField:shouldChangeCharactersInRange:replacementString:
    文字列が変更される直前に呼ばれる。変更範囲とそこに入る文字列は引数のrangeとstringで渡される。NOを返すと変更は反映されない。
  • – textFieldShouldClear:
    クリアボタン選択時に呼ばれる。YESを返すとクリアされる。
  • – textFieldShouldReturn:
    リターンキー選択時に呼ばれる。

入力制限は、入力中に行われるのが親切だと思うので、– textField:shouldChangeCharactersInRange:replacementString:で対応することにする。

NSFormatterの使い方を試してみる。

小終点以下1〜2桁までを表示する。

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMinimumFractionDigits:1];
[numberFormatter setMaximumFractionDigits:2];
NSNumber    *n = [NSNumber numberWithDouble:123456.123456];
NSString    *s = [numberFormatter stringFromNumber:n];
NSLog(@"%@", s);

お金として扱い、頭に¥をつける。

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setCurrencyCode:@"JPY"];
NSNumber *n = [NSNumber numberWithInt:123456.123456];
NSString *s = [numberFormatter stringFromNumber:n];
NSLog(@"%@", s);

今度は、末尾に円をつける。

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"#,##0円"];
NSNumber *n = [NSNumber numberWithInt:123456.123456];
NSString *s = [numberFormatter stringFromNumber:n];
NSLog(@"%@", s);

三桁毎にカンマ。

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setGroupingSeparator:@","];
[numberFormatter setGroupingSize:3];
NSNumber *n = [NSNumber numberWithInt:123456.123456];
NSString *s = [numberFormatter stringFromNumber:n];
NSLog(@"%@", s);

今の時刻を24時間表記で分まで表示。

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
NSString *s = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@", s);

頭に年月日を加える。

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm"];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
NSString *s = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@", s);

10桁の数字のみを受け付ける例を作ってみる。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSInteger i = [string integerValue];
    NSNumber *n = [[NSNumber alloc] initWithInteger:i];
    NSString *s = [numberFormatter stringFromNumber:n];
    if ([string compare:s] == NSOrderedSame) {
        return YES;
    }    
    return NO;
}

もっと、いい方法がありそうだが。。。

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ «前の日記(2012-08-08) 最新 次の日記(2012-08-13)» 編集