web-dev-qa-db-ja.com

resignFirstResponderがtextFieldShouldReturnのキーボードを非表示にしない

Returnが押されたときにキーボードを非表示にするUITextFieldのビューがあります。

私の機能はこれです:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
 if ( textField == userPassword ) {
  [textField resignFirstResponder];
 }
 return YES;
}

通常、キーボードは非表示にする必要がありますが、画面上には残ります。 resignFirstResponderが正しく呼び出されます。何が欠けていますか?

29
favo

これにiPadタグがあるのがわかります。 UIModalPresentationFormSheetを使用してモーダルビューを表示していますか?もしそうなら、これはFormSheetモーダルプレゼンテーションの制限であるように見えます(Appleは何らかの理由で故意にそれを行っているか、それはバグです)詳細については、他の質問を参照してください:

モーダルダイアログはキーボードを閉じません

横向きのiPadでキーボードを備えたモーダルビューコントローラーを閉じると場所が変わる

49
Brandon

モーダルダイアログを表示するときにキーボードを閉じることができる、この便利な方法があります。

 - (BOOL)disablesAutomaticKeyboardDismissal { return NO; }

これにより、Appleで設定されたモーダルダイアログのデフォルトの動作が上書きされ、キーボードを非表示にすることができます。これはUIViewControllerクラスにあります。

これが誰かに役立つことを願っています!

33
tony.stack

Interface Builderを使用している場合は、UITextFieldにデリゲートがクラスにリンクされているかどうかを確認してください。

-UITextFieldを選択し、ConnectionsのOutlets-> delegateで1つの接続が存在するかどうかを確認します。存在しない場合は、ファイルの所有者クラスに接続します。

これは、ファイルの所有者クラスとリンクする必要があります。このデリゲートは、メソッドを検索する場所を伝えます。メソッドをオーバーライドする場合は、オブジェクトがそれを検索する場所を指定する必要があります。

10
Marcos Issler

このソリューションは、上記のどれも実行しなかった後、私にとってはうまくいきました。 resignFirstResponderを呼び出した後、モーダルビューを追加して削除しました。



    [myTextField resignFirstResponder];
    UIViewController *dummyController = [[UIViewController alloc] init];
    UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
    [dummyController setView:dummy];
    [self presentModalViewController:dummyController animated:NO];
    [dummyController dismissModalViewControllerAnimated:NO];

7
gmeroz

Brandonによって言及されたバグに対処するために、モーダルビューコントローラーへの参照がまだ残っている限り、モーダルビューコントローラーを閉じて再度開くことを試みることができます。

[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];

(「自己」は、モーダルビューコントローラを最初に開いたときに使用したコントローラである必要があります)

4
drynaski

xcode 4.5.1

単にコントロールをクリックし、テキストフィールドでドラッグして。hファイルを離します

コントロールキー+ドラッグ

次に、ポップアップメニューで

connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;

次に接続ボタンをクリック

3
madusanka

私も同じ問題を抱えていました。デリゲートをInterface Builderでファイルの所有者に接続した後、Interface Builderでの保存を怠っていたことに気付きました。保存した後、再コンパイルすると、Enterキーを押すとキーボードが正しく表示されなくなります。

3
jmundie

UITextFieldDelegateプロトコルを実装することを覚えていますか?

2
WrightsCS

私はこの問題について非常に多くの記事を読みましたが、resignFirstResponderを呼び出すとオンスクリーンキーボードが非表示になりませんが、どの提案もうまくいきませんでした。

XCode 5(iOS 7)を使用していて、画面キーボードを必要とするいくつかのコントロールを含むiPhone画面がありますが、ユーザーがUIButtonをクリックすると、キーボードが消えます。

enter image description here

resignFirstResponderを試して1日を無駄にし、NOを返すようにdisablesAutomaticKeyboardDismissal関数を追加しましたが、何も機能しませんでした。オンスクリーンキーボードが表示されたら、それが二度と消えることはありませんでした。

しかし、私は小さな脳波を持っていました(私は小さな脳しか持っていないため)。

ここで、ユーザーがUIButtonをクリックすると、UITextFieldUITextViewを単にdisableにしますコントロール。

- (IBAction)btnDate_Tapped:(id)sender {
    //  The user has clicked on the "Date" button.
    self.tbClientName.enabled = NO;
    self.tbComments.editable = NO;

そして突然、アプリは、画面キーボードを必要とする編集可能なテキストフィールドがないことを発見し、キーボードを見えなくしてきちんとスライドさせます。

(安堵のため息。)

私のUIButtonは実際にポップアップダイアログを表示します。ユーザーがポップアップを閉じると、これら2つのコントロールが再び有効になるので、ユーザーがいずれかをタップすると、キーボードが再び表示されます。

-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController {
    //  The user has closed our popup dialog.
    //  We need to make our UITextField and UITextView editable again.
    self.tbClientName.enabled = YES;
    self.tbComments.editable = YES;
    ... etc...
}

簡単ですね。

そして驚くべきことに、この回避策はModalスタイルで表示されるUIViewControllersでも機能します。

これが他のXCode犠牲者の役に立つことを願っています。

1
Mike Gledhill

最も簡単な方法は次のとおりです。

  1. ユーザーインターフェイスビルダーに移動し、

  2. UITextFieldを選択し、「Control-Drag」で「Detail View Controller-Detail」を選択して離します。

  3. ウィンドウがポップアップします。次に、「アウトレット」の下で「デリゲート」を選択します。

それでおしまい。それは私のために働いた。

0
Timur Nurullaev

uIModalPresentationFormSheetにいる場合は、

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}
0
Jeremy Piednoel

フォーカスが移動したように見えるというコメントに基づいて、キーボードが次のテキスト入力フィールドのために開いたままになっている可能性があります。戻りキーが「次へ」キーの場合、textFieldShouldReturn:にYESを返すと、次のtextFieldが最初のレスポンダーになり、キーボードが表示されたままになります。

0
Chris Garrett

Swift 3.0:

override var disablesAutomaticKeyboardDismissal: Bool {
    get{
        return false
    }
    set {
        self.disablesAutomaticKeyboardDismissal = false
    }
}
0
Josh O'Connor

Swift 3.

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

    if textField == addressTextField {
        textField.resignFirstResponder()

        return false
    }

    return true
}
0
krish