1. ホーム
  2. ios

[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)

2022-03-19 21:28:27

質問

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

最後のテキストフィールドでキーボードを閉じてください。

IB the Buttons (Next / Done)を設定しましたが、今、行き詰っています。

textFieldShouldReturnアクションを実装しましたが、NextボタンとDoneボタンでキーボードが閉じてしまいます。

どうすればいいですか?

Cocoa for Mac OS X では、次のレスポンダチェーンがあり、どのコントロールが次にフォーカスを持つべきかをテキストフィールドに問い合わせることができます。これによって、テキストフィールド間のタブ操作が可能になります。しかし、iOS デバイスにはキーボードがなく、タッチのみなので、このコンセプトは Cocoa Touch への移行後も存続していません。

これは、2つの前提があれば、とにかく簡単にできるのです。

  1. すべて"tabbable"です。 UITextField は同じ親ビューにあります。
  2. そのタブ順序はtagプロパティで定義されます。

これを前提として、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.
}

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

Swift 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!