web-dev-qa-db-ja.com

「Next」がタップされたときに次のUITextFieldに移動する

サインアップフォームがあるiPadアプリケーションがあります。フォームは非常に基本的なもので、名前と電子メールアドレス用のUITextFieldが2つだけ含​​まれています。

最初のTextFieldは候補者の名前用です。名前を入力してキーボードの[次へ]を押すと、編集する次のメールアドレスTextFieldに自動的に移動します。

キーボードの次のボタンを設定して次のキーボードにジャンプする方法はありますか?

ありがとう

35
Paul Morris

View ControllerをUITextFieldデリゲートにし、UITextFieldデリゲートメソッドを実装する必要があります:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (textField == nameField) {
        [textField resignFirstResponder];
        [emailField becomeFirstResponder];
    } else if (textField == emailField) {
        // here you can define what happens
        // when user presses return on the email field
    }
    return YES;
}

Swiftバージョン:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == nameField {
        textField.resignFirstResponder()
        emailField.becomeFirstResponder()
    } else if textField == emailField {
        // here you can define what happens
        // when user presses return on the email field
    }
    return true
}

また、emailFieldが表示されるようにビューをスクロールすることもできます。 View ControllerがUITableViewControllerのインスタンスである場合、これは自動的に行われます。そうでない場合は、 this Apple document 、特にキーボードの下にあるコンテンツの移動)をお読みください。

75
lawicko

@lawickoの答えに加えて、私はしばしばボタンテキストを変更してその最終仕上げを与えます(たとえば、フィールドがさらにある場合はnext、最後の場合はdoneと言います):

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    BOOL isLastTextField = //.. your logic to figure out if the current text field is the last

    if (isLastTextField) {
        textField.returnKeyType = UIReturnKeyDone;
    } else {
        textField.returnKeyType = UIReturnKeyNext;
    }
}
10
Paul.s

正解の迅速なバージョン。

私の経験では、textFieldsを切り替えるときにresignFirstResponderを使用する必要はありません。

この例では、基本的なユーザー名とパスワードのtextFieldsのみです。

ストーリーボードのユーザー名のキーボード「リターンキー」は「次へ」に設定され、パスワードのキーボードは「完了」に設定されます。

enter image description here

次に、これらの2つのテキストフィールドのデリゲートを接続し、この拡張機能を追加するだけで完了です。

extension LoginViewController: UITextFieldDelegate {

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        if textField == textFieldPassword {
            self.view.endEditing(true)
        } else {
            textFieldPassword.becomeFirstResponder()
        }
        return true
    }

}
10
William T.

より一貫した堅牢な方法は、 NextResponderTextField を使用することです。これは、インターフェイスビルダーから完全に構成できます。

あなたがする必要があるのは

  1. UITextFieldのクラスタイプをNextResponderTextFieldに設定します enter image description here
  2. 次に、nextResponderFieldのアウトレットを、次のレスポンダーを指すように設定します。次のレスポンダーは、UITextFieldまたはUIResponderサブクラスになります。 UIButtonにすることもでき、ライブラリはボタンが有効な場合にのみボタンのTouchUpInsideイベントをトリガーするのに十分スマートです。 enter image description hereenter image description here

動作中のライブラリは次のとおりです。

enter image description here

5
mohamede1945

A Swift 4拡張機能。 UITextFieldsの配列を渡すだけで、最初のレスポンダーを辞任する(キーボードを非表示にする)最後の配列まで各配列を接続します。

extension UITextField {

    class func connectFields(fields: [UITextField]) {
        guard let last = fields.last else { return }

        // To reset the targets in case you call this method again to change the connected fields
        fields.forEach { $0.removeTarget(nil, action: nil, for: .editingDidEndOnExit) }

        for i in 0 ..< fields.count - 1 {
            fields[i].returnKeyType = .next
            fields[i].addTarget(fields[i + 1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
        }

        last.returnKeyType = .continue
        last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
    }
}
3
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
    if (textField == self.textFieldName)
    {
        [self.textFieldName resignFirstResponder];
        [self.textFieldPassword becomeFirstResponder];
    }
    else if (textField == self.textFieldPassword)
    {
        [self.textFieldPassword resignFirstResponder];

        [self login:self];
    }

    return true;
}




@interface MLLoginViewController ()<UITextFieldDelegate>

@end

@implementation MLLoginViewController



- (void)viewDidLoad {
    [super viewDidLoad];
    self.textFieldName.delegate = self;
    self.textFieldPassword.delegate = self;
0
Gank

テキストフィールドのアウトレットを作成してから、

viewController.h

(IBAction)textFieldDoneEditing:(id)sender;

viewController.m

(IBAction)textFieldDoneEditing:(id)sender {
    [textField resignFirstResponder];
    if (textField == nameField) {
        [emailField becomeFirstResponder];
    } 
} 

(接続インスペクタを表示>送信イベント)didEndOnExitとtextFieldDoneEditingの関係を作成します

0
davidrl1000