UITextFieldやUITextViewへのカスタムキーボード適用


前回のカスタムキーボードではまりかけたところ。

単純に各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 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...