【iOS】UITextFieldの文字列長チェック-日本語対応

日本語対応第二弾

ググるとよく出てくるあれ。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *str = [textField.text stringByReplacingCharactersInRange:range withString:string];
    if (str.length > 0 && str.length <= 10)
        return YES;
    return NO;
}

どこのソース見ても大体こうなってるけどさ。
これ、英字キーボード以外まともに動かんからね。

ということで、まともに動くのはこちら。
iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話 - blog.niw.at



参考までに抜粋。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:textField];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    self.previousText = textField.text;
    self.lastReplaceRange = range;
    self.lastReplacementString = string;
    return YES;
}

- (void)textFieldDidChange:(NSNotification *)notification
{
    UITextField *textField = (UITextField *)notification.object;
    if (textField.markedTextRange)
        return;
    
    if (textField.text.length > 0 &&  textField.text.length <= 10) {
        NSInteger offset = maxLength - textField.text.length;
        
        NSString *replacementString = [self.lastReplacementString substringToIndex:([self.lastReplacementString length] + offset)];
        NSString *text = [self.previousText stringByReplacingCharactersInRange:self.lastReplaceRange withString:replacementString];
        
        UITextPosition *position = [textField positionFromPosition:textField.selectedTextRange.start offset:offset];
        UITextRange *selectedTextRange = [textField textRangeFromPosition:position toPosition:position];
        
        textField.text = text;
        textField.selectedTextRange = selectedTextRange;
    }
}