2010年5月17日月曜日

テキストボックス

テキストを入力する為のコントロールにはUITextFieldがあります。これは1行しか入力できないコントロールなのでURL等を指定する時に使います。
複数の行を入力させるにはUITextViewを使います。
メモ帳のようなアプリケーションではUITextViewを使います。

UITextFieldは1行の入力なので、仮想キーボード上でEnterキーを押せば編集が完了したことが分かりますが、UITextViewのように複数行を編集させるコントロールの場合、Enterキーは改行を意味することになります。
そのため、編集の開始、終了等を明確にする為にdelegateを使ってアプリケーションに通知する仕組みが備わっています。


- (BOOL) textViewShouldBeginEditing: (UITextView*) textView
(戻り値) BOOL YES or NO
編集を開始しても良いかの問い合わせ
アプリケーション側で都合が悪ければ戻り値にNOを返却します。


- (void) textViewDidBeginEditing: (UITextView*) textView
編集が開始されたことを通知
このデリゲート上で編集終了用のボタンを表示したりします。


- (void) textViewDidChangeSelection: (UITextView*) textView
編集中のテキストが選択された時及びカーソル位置が変更された時に呼ばれます。
これが呼出された時にtextViewのselectedRangeプロパティを取得すると、NSRange型の選択範囲の情報が取得できます。NSRange型はカーソルの位置(location)と長さ(length)をNSUInteger型で格納する構造体です。
カーソル位置が変更されただけの場合はlengthには0が入ります。


- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
(戻り値)BOOL YES or NO
テキストを変更しても良いかの事前通知です。
rangeに変更対象の位置(location)と長さ(length)が入り、textに変更後の文字列が入っています。
このデリゲートは選択範囲の置き換えだけでなく、1文字入力や、文字削除の場合も呼出されます。
1文字入力の場合はrangeの長さ(length)が0になっています。また、文字削除の場合はrangeの位置(location)と長さ(length)に削除範囲が設定され、textに空の文字列が設定されることになります。
テキスト入力を許可する場合はYESを返却し、アプリケーション側で許可したくない場合はNOを返却します。


- (void) textViewDidChange: (UITextView*) textView
テキストが変更されたことの通知です。


- (BOOL) textViewShouldEndEditing: (UITextView*) textView
(戻り値)BOOL YES or NO
編集を終了しても良いかの問い合わせです。
アプリケーション側で編集を終わらせたくない場合にはNOを返却しますが、NOを返却するとフォーカスが他のコントロールに移動できないことになるので注意が必要です。


- (void) textViewDidEndEditing: (UITextView*) textView
編集が終了したことを通知します。



最後の2つのデリゲート(textViewShouldEndEditing/textViewDidEndEditing)は少し注意が必要です。

UITextViewが複数ある場合は別のUITextViewコントロールをタップすれば上記2つのデリゲートを呼出してくれますが、UITextViewコントロールが1つしか無い場合、ユーザーが編集を終わらせるきっかけがなくなってしまうことになります。(編集を終わらせるボタンが無い為)
このため、編集を終わらせる為にUIBarButtonItem等が押された時にUITextViewに編集終了を通知する必要があります。
この為のメソッドがUIResponderクラスにある「resignFirstResponder」メソッドです。
UITextViewクラスはUIResponderクラスを継承しているのでこのメソッドを呼出すことが可能です。

ボタンが押された時のイベントとしてresignFirstResponderを呼出してあげれば、UITextViewが編集の終了を検知してtextViewShouldEndEditing/textViewDidEndEditingのデリゲートを呼出してくれることになります。


- (void) endEditButtonClick
{
    //  UITextViewクラスに編集の終了を通知
    [ textView resignFirstResponder ];
}

0 件のコメント:

コメントを投稿