前回のカスタムキーボードではまりかけたところ。
単純に各view(UITextField, UITextView)に文字列を追加するだけでは、
それぞれのdelegateが呼ばれません。
-(void)selectWord:(UIButton*)button{ _textField.text = [_textField.text stringByAppendingString:str];}
標準のキーボードと同じようにdelegateを考慮した作りをしたいので、調べてみました。
UITextInput
UITextFieldや、UITextViewはUITextInputを実装しています。UITextInputはどのようなプロトコルかというと、
- テキスト入力と相互作用するもの
- 位置や、範囲などを管理
テキストの入出力の中心的なプロトコルを決めている
他には
- UITextPosition, UITextRange
- UITextInputTokenizer, UITextInputStringTokenizer
- UITextInputDelegate
- UIKeyInput
などなど
そして、そこに定義してある通りにUITextViewやUITextFieldは実装してあるわけで。。。
ここら辺は表示側と、入力側がうまくやりとりできるように定義しているみたい
textInRange : 選択中の文字列を取得
selectedTextRange : 選択中の位置を取得
textInputView : 実態への参照(UITextField, UITextViewなど)
inputDelegate : UITextInputDelegate
UIKeyInput Protocol
ここが本題かも。文字列の入力や削除等はUIKeyInput Protocolで実装されているため、
今回だと、[_textField.text insertText]を呼び出せばOK
- insertText 文字の入力
- deleteBackward 削除
- hasText 文字の存在確認
UITextInputDelegate Protocol
そして、テキスト入力などはtextFieldShouldBeginEditingや、textFieldDidBeginEditingなどがあり、そのDelegateを正しく呼び出すために
- textWillChangeやtextDidChangeを呼ぶ
0 件のコメント:
コメントを投稿