最新の記事
カテゴリ
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧
|
※記述に誤りがあったので修正しました。2/13
UITextFieldをユーザーがタッチするとソフトウェアキーボードが現れ文字の入力が行われるわけだが、入力文字数を制限したい時がある。 その場合、 UITextFieldDelegate プロトコルの- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)stringをオーバーライドする。このメソッドはデリゲート(コールバック)であり、引数の条件での入力を許可したい場合は YESを、許可しない場合はNOを返すようにしてやる。 それぞれの引数の意味はマニュアルでは, textField そのテクストを含むtextField range リプレイスされる文字列の範囲 string リプレイスする文字列 とあるが、ソフトウェアキーボードからの入力があった場合、実際には、range=変更元の文字数, string=追加する文字という意味に近い。 具体的には、text フィールド変数に、'abc'が入っているとして、ユーザーが'd'をキーボードから入力した場合、 textField.text = @"abc" range.location = 3 range.length = 0 string = @"d" となる。 文字数制限をするには、このrange引数で現在入力済みの文字数を調べ、文字数が規定の文字数以内であればYESを、規定外であればNOを返してやればよい。 以下の例の場合、UITextFieldのインスタンスであるnameEditorがキーボードから文字を受け取るたびに textField:shouldChangeCharactersInRange:replacementString: デリゲートを呼び、文字を追加して良いものかどうか尋ねる。nameEditorはこのデリゲートがNOを返してきた場合、入力文字を追加しない。 @interface MyController : UIViewController<UITextFieldDelegate> { UITextField* nameEditor; ... } .... @end @implementation MyController ... - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { BOOL change = NO; if( textField == nameEditor ) { if( range.location + range.length + [ string length ] < MAX_NAME_LENGTH ) { change = YES; } } return change; } ... @end 候補選択モード(入力中に入力文字列が水色のハイライトで表示される)で入力された場合、上記の動作とは異なる。 例えば、textField.text に@"abc", 候補が@"de"で更に@"f"を入力した場合、 range.location == 3 range.length == 2 string == @"d" [ string length ] == 1 となる。1文字入力モードの時は、range.length == 0 となり、候補選択モードの場合は、候補文字列の長さが入る。 ちょっと不可解で上記の情報が確実とは言えないので注意していただきたい。
by ngc1208
| 2009-02-12 00:51
| iPhone
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ファン申請 |
||