【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; } }