サファリで使用されているポップアップキーボードに似たものを再現しようとしています。
ビューと適切なボタンの上にツールバーを配置することで視覚的に再現できますが、ユーザーが完了ボタンに触れた後、キーボードを閉じる方法がわかりません。
やってみました:
[viewReceivingKeys resignFirstResponder];
ここで、viewReceivingKeys
はテキスト入力を受信しているUIViewですか?
覚えておく必要のあることがいくつかあります。開発者が設定するのを忘れている一番の部分は、textFieldのdelegateです。
Interface Builderを使用している場合は、textFieldのデリゲートをファイルOwnerに設定する必要があることを覚えておく必要があります。
Interface Builderを使用していない場合は、テキストフィールドのデリゲートを自分自身に設定してください。 returnTypeも含めます。たとえば、textFieldがgameFieldと呼ばれた場合:
gameField.delegate = self;
gameField.returnKeyType = UIReturnKeyDone;
また、ViewControllerにITextFieldDelegateを実装する必要があります。
@interface YourViewController : UIViewController <UITextFieldDelegate>
最後に、textFieldShouldReturnメソッドを使用して、[textField resignFirstResponder]を呼び出す必要があります。
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
return YES;
}
すべてのtextFieldsはこれと同じメソッドを使用するため、この設定は1回だけで済みます。デリゲートがtextFieldに設定されている限り、UITextFieldDelegateがインターフェイスに実装され、textFieldShouldReturnメソッドを追加して、セットのresignFirstResponderを呼び出します。
Interface Builderで独自のビューを構築する場合は、View Controllerをテキストフィールドのデリゲートに設定し、ViewsControllerのUITextFieldDelegateからtextFieldShouldReturn:を実装します。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
NSLog(@"%@ textFieldShouldReturn", [self class]);
[theTextField resignFirstResponder];
// do stuff with the text
NSLog(@"text = %@", [theTextField text]);
return YES;
}
キーボードをUITextField
ではなくUITextView
から削除することについて話している場合。あなたの質問はそれほど明確ではありませんか?次に、クラスがインターフェイスファイルでUITextFieldDelegate
としてマークされていることを確認した場合は
@interface MyController: UIViewController <UITextFieldDelegate> {
UITextField *activeTextField;
// ...remainder of code not show ...
}
次に、以下の2つのデリゲートメソッドを実装する必要があります。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
activeTextField = textField;!
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
activeTextField = nil;
[textField resignFirstResponder];
return YES;
}
ただし、UITextView
を使用している場合は、少し複雑になります。 UITextViewDelegate
プロトコルには、textFieldShouldReturn:
メソッドと同等の方法がありません。おそらく、Returnキーが、ユーザーが複数行のテキストエントリのテキストの編集を停止したいというシグナルであると期待すべきではないためです。ダイアログ(結局のところ、ユーザーはReturnキーを押して改行を挿入したい場合があります)。
ただし、キーボードを使用してUITextView
がファーストレスポンダーとして辞任できないことを回避する方法はいくつかあります。通常の方法は、UITextView
がポップアップキーボードを表示しているときに、ナビゲーションバーにDoneボタンを配置することです。タップすると、このボタンはテキストビューにファーストレスポンダーとして辞任するように要求し、その後キーボードを閉じます。
ただし、インターフェースの計画方法によっては、ユーザーがUITextView
自体の外側をタップしたときにUITextView
を辞任させたい場合があります。これを行うには、UIView
をサブクラス化してタッチを受け入れ、ユーザーがビュー自体の外側をタップしたときに辞任するようにテキストビューに指示します。
新しいクラスを作成し、
#import <UIKit/UIKit.h>
@interface CustomView : UIView {
IBOutlet UITextView *textView;
}
@end
次に、実装で、touchesEnded:withEvent:
メソッドを実装し、UITextView
にファーストレスポンダーとして辞任するように依頼します。
#import "CustomView.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// Initialization code
}
return self;
}
- (void) awakeFromNib {
self.multipleTouchEnabled = YES;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touches began count %d, %@", [touches count], touches);
[textView resignFirstResponder];
[self.nextResponder touchesEnded:touches withEvent:event];
}
@end
クラスを追加したら、すべての変更を保存してから、InterfaceBuilderに移動してビューをクリックする必要があります。ユーティリティページでIdentityInspectorを開き、nibファイルのビューのタイプをデフォルトのCustomView
クラスではなくUIView
に変更します。次に、接続インスペクターで、textView
コンセントをUITextView
にドラッグします。これを行った後、アプリケーションを再構築すると、アクティブなUI要素の外側をタッチするとキーボードが閉じます。ただし、サブクラス化するUIView
が他のUI要素の「背後」にある場合、これらの要素はUIViewレイヤーに到達する前にタッチをインターセプトすることに注意してください。したがって、このソリューションは洗練されていますが、一部の状況でのみ使用できます。多くの場合、キーボードを閉じるには、ナビゲーションバーに完了ボタンを追加する強引な方法に頼る必要があります。
ナビゲーションコントローラーを使用して、完了したらビューをポップしますか?
たとえば、次のようなコードを使用して、aboutボックスを次の場所にスライドさせます。
[[self navigationController] presentModalViewController:modalViewController animated:YES];
そして、そのaboutボックスのボタンがクリックされると、これを使用してそれを取り除きます。
[self.navigationController dismissModalViewControllerAnimated:YES];
私の場合、aboutボックスが画面全体を占めていますが、これが機能するために必要なことではないと思います。
編集:私はあなたの質問を誤解したかもしれないと思います。私のコードの行に沿った何かは、あなたがキーボードビュー全体を自分で偽造している場合です。ツールバーが上に追加された通常のキーボード。