iPhone キーボードの「次へ」ボタンを使用して、すべてのテキスト フィールドを移動するにはどうすればよいですか?
最後のテキスト フィールドではキーボードが閉じられます。
IB ボタン (次へ / 完了) を設定しましたが、行き詰まってしまいました。
textFieldShouldReturn アクションを実装しましたが、[次へ] ボタンと [完了] ボタンによってキーボードが閉じられます。
ベストアンサー1
Cocoa for Mac OS X には、次のレスポンダ チェーンがあり、テキスト フィールドに次にどのコントロールにフォーカスするかを尋ねることができます。これにより、テキスト フィールド間のタブ移動が機能します。ただし、iOS デバイスにはキーボードがなく、タッチのみであるため、この概念は Cocoa Touch への移行後も存続していません。
これは、次の 2 つの仮定を守れば簡単に実行できます。
- すべての「タブ可能」
UITextField
は同じ親ビュー上にあります。 - 「タブ順序」はタグ プロパティによって定義されます。
これを前提として、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!