6

このメソッドを使用して、ユーザーが UITextField の外に触れたときにキーボードを取り除こうとしています:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [mainTextController resignFirstResponder];
    [super touchesBegan:touches withEvent:event];
}

ただし、これはキーボードのリターンボタンを押した後に呼び出されるメソッドを呼び出すようですが、キーボードが消えてほしいだけで、リターンを押してはいけません。どうすればそれを達成できますか?

ありがとう!

編集: tGilani の答えは最も簡単な方法であり、UIControl に変更することなく魅力的に機能します。しかし、ジョンクロールの答えもうまくいくと思います。

4

3 に答える 3

13

試す

[self.view endEditing:YES];

アップデート:

ブール値を取り、init メソッドで false に設定します。デリゲート メソッド メソッドで、textFieldShouldReturnfalse の場合はコードを実行し、そうでない場合はスキップします

- (BOOL) textFieldShouldReturn:(UITextField*)textField
{
    if (!boolean)
    {
        // YOur code logic here
    }
    boolean = false;
}

endEditing メソッドを呼び出すメソッドで、ブール値を true に設定します。

boolean = YES;      
[self.view endEditing:YES];
于 2012-08-12T18:01:13.477 に答える
8

これが私が以前にこれを処理した方法です。最初に、テキスト フィールドのファーストレスポンダー ステータスを辞任してキーボードを閉じるメソッドを View Controller に作成します。

- (IBAction)dismissKeyboard:(id)sender
{
    [mainTextController resignFirstResponder];
}

次に、ViewController(またはnib、ストーリーボードを使用していない場合は) のストーリーボード シーンで、ViewController のviewプロパティのクラスを からUIViewに変更しますUIControl。プロパティは、view事実上、他の UI 要素の背後にある背景です。UIViewタッチ イベントには応答できませんが、UIControl(の直接のサブクラスである) は応答できるため、クラス タイプを変更する必要がありUIViewます。

最後に、ViewController のメソッドで、ビューがイベントを受け取ったときにメソッドviewDidLoad:を実行するように View Controller に指示します。dismissKeyboardUIControlEventTouchDown

- (void)viewDidLoad
{
    [super viewDidLoad];       
    UIControl *viewControl = (UIControl*)self.view;
    [viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown];
}

編集:

あなたの懸念の一部はtextFieldDidEndEditing:、キーボードが閉じられたときに呼び出されるようです。これは避けられません。テキスト フィールドがフォーカスを失った場合 (つまり、ファーストレスポンダー ステータス) に常に呼び出されます。ユーザーが の戻るボタンをクリックしたときに実行するコードを配置したことが問題のようですtextFieldDidEndEditing:。ユーザーがテキスト フィールドの外側に触れたときにそのコードを実行したくない場合は、それを配置する適切な場所ではありません。

代わりに、そのコードを別のメソッドに入れます。

- (IBAction)textFieldReturn:(id)sender
{
    if ([mainTextController isFirstResponder]) {
            [mainTextController resignFirstResponder];

            // put code to run after return key pressed here...
        }
    }
}

次に、テキスト フィールドがコントロール イベントを送信するときに、Target-Action を介してそのメソッドを呼び出しますUIControlEventEditingDidEndOnExit

[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];

UIControlEventEditingDidEndOnExitとは異なりますのでご注意くださいUIControlEventEditingDidEnd。前者は、ユーザーがコントロールの外側をタッチして編集を終了したときに呼び出され、後者は、ユーザーがリターン キーを押して編集を終了したときに呼び出されます。

于 2012-08-12T18:41:57.197 に答える
0

ViewController'sビュー プロパティをIdentity InspectorUIViewを使用するように変更する必要があります。UIControl

そこから、単純に を作成しIBAction、テキストフィールドに閉じるように指示します (これはあなたの であると想定していますmainTextController)。mainTextControllerキーボードを閉じたいテキストフィールドでない場合は、resignFirstReaponderメソッドをテキストフィールドに変更します。

- (IBAction)backgroundTap:(id)sender {
[myTextField resignFirstResponder];
}

次に、そこからビュー コントローラーの.xibファイルに戻り、アクションをコントロール ビューに接続し、[タッチ ダウン] を選択します。

于 2012-08-12T20:19:17.130 に答える