テキストフィールドを移動する方法(次へ/完了ボタン) 質問する

テキストフィールドを移動する方法(次へ/完了ボタン) 質問する

iPhone キーボードの「次へ」ボタンを使用して、すべてのテキスト フィールドを移動するにはどうすればよいですか?

最後のテキスト フィールドではキーボードが閉じられます。

IB ボタン (次へ / 完了) を設定しましたが、行き詰まってしまいました。

textFieldShouldReturn アクションを実装しましたが、[次へ] ボタンと [完了] ボタンによってキーボードが閉じられます。

ベストアンサー1

Cocoa for Mac OS X には、次のレスポンダ チェーンがあり、テキスト フィールドに次にどのコントロールにフォーカスするかを尋ねることができます。これにより、テキスト フィールド間のタブ移動が機能します。ただし、iOS デバイスにはキーボードがなく、タッチのみであるため、この概念は Cocoa Touch への移行後も存続していません。

これは、次の 2 つの仮定を守れば簡単に実行できます。

  1. すべての「タブ可能」UITextFieldは同じ親ビュー上にあります。
  2. 「タブ順序」はタグ プロパティによって定義されます。

これを前提として、textFieldShouldReturn: を次のようにオーバーライドできます。

-(BOOL)textFieldShouldReturn:(UITextField*)textField
{
  NSInteger nextTag = textField.tag + 1;
  // Try to find next responder
  UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
  if (nextResponder) {
    // Found next responder, so set it.
    [nextResponder becomeFirstResponder];
  } else {
    // Not found, so remove keyboard.
    [textField resignFirstResponder];
  }
  return NO; // We do not want UITextField to insert line-breaks.
}

さらにコードを追加すると、仮定も無視できるようになります。

スウィフト4.0

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let nextTag = textField.tag + 1
    // Try to find next responder
    let nextResponder = textField.superview?.viewWithTag(nextTag) as UIResponder!

    if nextResponder != nil {
        // Found next responder, so set it
        nextResponder?.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard
        textField.resignFirstResponder()
    }

    return false
}

テキストフィールドのスーパービューがUITableViewCellの場合、次のレスポンダーは

let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTag) as UIResponder!

おすすめ記事