【iOS】UITextField 에서의 알파벳 대문자 제한, 길이 제한

UITextField의 알파벳 대문자 제한



iOS 앱에서 입력 상자로 사용되는 UITextField에서,
알파벳 대문자 전용 입력으로 제한하고 싶습니다!
Android의 경우 【Android】EditText에서 알파벳 대문자 제한, 길이 제한을 참조하십시오.

환경



호스트: MaxOS Mojave
Xcode: 10
Objective-C

입력시 키보드 설정



StoryBoard에서 대상 UITextField를 선택하여 Attributes Inspector를 열고 편집합니다.


설정 방법


  • 대상의 UITextField 를 Outlet 로 관련짓는다
  • 헤더 파일에서 UITextFieldDelegate 구현 설정
  • Main.StoryBoard를 열고 대상 UITextField를 선택합니다.
  • 오른쪽 창에서 Attributes Inspector 선택
  • Capitalization 에 All Characters, KeyboardType 에 ASCII Capable 을 선택

  • MyView.h
    @interface MyView : UIViewController<UITextFieldDelegate, ...>
    
    @property (weak, nonatomic) IBOutlet UITextField *targetField;
    
    @end
    

    함수 준비



    Constant.m
    NSString* const ALPHABET_UPPER = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSString* const ALPHASPACE_ONLY = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    
    +(NSString*) getAlphabetUpperCharacters {
        return ALPHABET_UPPER;
    }
    +(NSString*) getAlphaSpaceCharacters {
        return ALPHASPACE_ONLY;
    }
    
    // アルファベット+スペース以外があるかチェック
    +(BOOL) containsAlphabetWithSpace:(NSString*) string {
    
        NSCharacterSet *alphaSet = [NSCharacterSet characterSetWithCharactersInString:[Constant getAlphaSpaceCharacters]];
        NSCharacterSet *invSet = [alphaSet invertedSet];
        NSRange range = [string rangeOfCharacterFromSet:invSet];
        if (range.location != NSNotFound) {
            NSLog(@"Except alphabet and space:%@", string);
            return false;
        }
        return true;
    }
    
    // アルファベット大文字以外があるかチェック
    +(BOOL) containsAlphabetUpper:(NSString*) string {
        NSCharacterSet *alSet = [NSCharacterSet characterSetWithCharactersInString:[Constant getAlphabetUpperCharacters]];
        NSCharacterSet *invSet = [alSet invertedSet];
        NSRange range = [string rangeOfCharacterFromSet:invSet];
        if (range.location != NSNotFound) {
            NSLog(@"Except upper alphabet:%@", string);
            return false;
        }
        return true;
    }
    

    Delegate 구현


  • shouldChangeCharactersInRange 함수 구현

  • MyView.m
    - (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
        BOOL replaceUpper = false;
        NSUInteger maxLength = 0;
    
        // 位置情報
        UITextPosition* beginning = textField.beginningOfDocument;
        UITextPosition* start = [textField positionFromPosition:beginning offset:range.location];
        UITextPosition* end = [textField positionFromPosition:start offset:range.length];
        UITextRange* textRange = [textField textRangeFromPosition:start toPosition:end];
    
        if(textField == _targetField) {
            maxLength = 5;
            // check alphabet only
            if (![Constant containsAlphabetWithSpace:string]) {
                return false;
            }
            if (![Constant containsAlphabetUpper:string]) {
                replaceUpper = true;
            }
        }
    
        NSUInteger oldLength = [textField.text length];
        NSUInteger replacementLength = [string length];
        NSUInteger rangeLength = range.length;
    
        NSUInteger newLength = oldLength - rangeLength + replacementLength;
        if (newLength > maxLength) {
            return false;
        }
    
        if ([string rangeOfString: @"\n"].location != NSNotFound) {
            return false;
        }
    
        // テキスト置換は他の制限判定後
        if (replaceUpper) {
            [textField replaceRange:textRange withText:[string uppercaseString]];
            return false;
        }
        return true;
    }
    

    실제 기계 테스트



    키보드로 숫자 입력을 할 수 없는 것, 길이의 제한이 되어 있는 것,
    소문자를 입력하면 대문자로 자동 변환되는지 확인합니다.

    이상, 수고하셨습니다!

    좋은 웹페이지 즐겨찾기