UITextViewにはイベントがありません
-
22-07-2019 - |
質問
テキストをキャプチャするために複数行のテキストフィールド(UITextView)を必要とするiPhoneアプリケーションを開発しています。
ユーザーがtextView内をタッチすると、firstResponderになり、キーボードが表示されます。本当に必要なのは、ユーザーが終了したらキーボードを取り外すことです。通常、テキストフィールドでは、[戻る] / [完了]ボタンを押すと入力の終了が通知され、デリゲートを使用してファーストレスポンダーを辞任します。ただし、複数行のテキストビューでは、ユーザーが新しい行を追加できるようにして、それができないようにします。
次のオプションは、テキストビューの外側で修正があった場合、最初のレスポンダーを辞任することです。ここでの問題は、UITextViewで宣言されているイベントがインターフェイスビルダーで確認できないことです。
iPhoneアプリで複数行のテキストフィールドを作成して、最初のレスポンダーをユーザーが使い切ったときに適切なタイミングでリリースする方法を教えてください
解決
ナビゲーションバーの[完了]ボタンを使用できます。
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
}
キーボードを閉じるには、次のようなイベントを処理します:
- (void) doneAction: (id) sender{ [textView resignFirstResponder]; }
(。hファイル宣言を記憶)
他のヒント
「不足」を嘆いていると思います。複数行のUItextViewで返されるキーボードの完了ボタン。間違っている場合は修正してください。
明らかなアプローチでは、最初のレスポンダーを辞める別のボタンがインターフェースにあるようです。
何らかのイベントでキーボードを隠す巧妙なコードは、非常に直感的に使用できるとは思いません。
Apple Notesアプリケーションは右上の完了ボタンを使用してファーストレスポンダーを辞退します。このようなアプローチは賢明なようです。
//If user touches outside of the keypad, then the keypad will go away
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if (touch.tapCount >= 1) {
[ZLabel resignFirstResponder];
}
}
すべての画面を覆う非表示ボタンを作成し、それにメソッドを追加できます。このように動作すると思います。
- (IBAction)backgroundClick:(id)sender{
[textView resignFirstResponder];
}
キーボードの「完了」キーを完全に設定している場合、使用する方法は、内容が変更されたときにUITextViewの最後の文字をチェックすることです。最後の文字が改行の場合、ユーザーは完了ボタンを押しています。別のボタンがあるはずだというニールの見解を改めて考えますが、顧客が望むものを手に入れることもあります。
明らかに、このメソッドが存在するクラスを指すようにUITextViewのデリゲートを設定する必要があります。 -(void)textViewDidChange:(UITextView *)inTextView
メソッドは、UITextViewDelegateプロトコルの一部です。
- (void)textViewDidChange:(UITextView *)inTextView {
NSString *text = inTextView.text;
if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') {
message = [text substringToIndex:[text length] -1];
[delegate messageEdited];
[self removeFromSuperview];
}
}
-
(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
[txtView resignFirstResponder];
YESを返します。 }