web-dev-qa-db-ja.com

iPhoneキーボード、完了ボタン、およびresignFirstResponder

これはおそらく馬鹿げた質問ですが、ドキュメントで答えが見つかりません。ポップアップキーボードの[完了]ボタンは常にキーボードを非表示にしましたか?私はこのようなウェブの周りにたくさんのコードを見ます:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    [theTextField resignFirstResponder];
    return YES;
}

「完了」ボタンを押すと、キーボードがポップダウンし、UITextFieldがファーストレスポンダーを辞任します。

「完了」ボタンを押してもUITextFieldからresignFirstResponderが発生することはなかったと思われますが、その動作はいつか変更されました。

OS 3.0-3.1.3でデバッグしています

50
nevan king

UITextFieldとこのコードだけで小さなテストプロジェクトを作成しました

#import <UIKit/UIKit.h>
@interface TextFieldTestViewController : UIViewController
<UITextFieldDelegate>
{
    UITextField *textField;
}
@property (nonatomic, retain) IBOutlet UITextField *textField;
@end

#import "TextFieldTestViewController.h"
@implementation TextFieldTestViewController
@synthesize textField;

- (void)viewDidLoad
{
    [self.textField setDelegate:self];
    [self.textField setReturnKeyType:UIReturnKeyDone];
    [self.textField addTarget:self
                  action:@selector(textFieldFinished:)
        forControlEvents:UIControlEventEditingDidEndOnExit];
    [super viewDidLoad];
}
- (IBAction)textFieldFinished:(id)sender
{
    // [sender resignFirstResponder];
}

- (void)dealloc {
    [super dealloc];
}
@end

テキストフィールドは、変更されていないUITextFieldで、アウトレットが接続された状態でNIBにドラッグされます。
アプリを読み込んだ後、テキストフィールドをクリックするとキーボードが表示されます。 「完了」ボタンを押すと、テキストフィールドのフォーカスが失われ、キーボードがアニメーション化されます。ウェブに関するアドバイスは、常に[sender resignFirstResponder]しかし、これはそれなしで動作します。

92
nevan king

Xcode 5.1で

完了ボタンを有効にする

  • ストーリーボードのUITextFieldの属性インスペクターで、フィールド「Return Key」を見つけ、「Done」を選択します

[完了]が押されたときにキーボードを非表示にする

  • ストーリーボードで、ViewControllerをUITextFieldのデリゲートにします
  • このメソッドをViewControllerに追加します

    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
15
bickster

ドキュメント(任意のバージョン)から:

選択した時点でキーボードを閉じるのはアプリケーションの責任です。ユーザーがユーザーインターフェイスの特定のボタンをタップするなど、特定のユーザーアクションに応答してキーボードを閉じることができます。また、ユーザーがキーボード自体の「return」キーを押したときにキーボードを閉じるようにテキストフィールドデリゲートを構成することもできます。キーボードを閉じるには、現在最初の応答者であるテキストフィールドにresignFirstResponderメッセージを送信します。これを行うと、テキストフィールドオブジェクトは現在の編集セッションを終了し(デリゲートオブジェクトの同意を得て)、キーボードを非表示にします。

そのため、何らかの方法でresignFirstResponderを送信する必要があります。ただし、textFieldShouldReturn:メッセージの処理中に、テキストフィールドが別の方法でフォーカスを失う可能性があります。これにより、キーボードが消えます。

6
bealex

[完了]ボタンの1行のコード:-

[yourTextField setReturnKeyType:UIReturnKeyDone];

TextFieldのvalueChangedにアクションメソッドを追加し、この行を追加します-

[yourTextField resignFirstResponder];
2
mmx

この方法を使用して、テキストフィールドの選択を変更しました

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

if ([textField isEqual:self.emailRegisterTextField]) {

    [self.usernameRegisterTextField becomeFirstResponder];

} else if ([textField isEqual:self.usernameRegisterTextField]) {

    [self.passwordRegisterTextField becomeFirstResponder];

} else {

    [textField resignFirstResponder];

    // To click button for registration when you clicking button "Done" on the keyboard
    [self createMyAccount:self.registrationButton];
}

return YES;

}

0
EddieG