サインアップフォームがあるiPadアプリケーションがあります。フォームは非常に基本的なもので、名前と電子メールアドレス用のUITextFieldが2つだけ含まれています。
最初のTextFieldは候補者の名前用です。名前を入力してキーボードの[次へ]を押すと、編集する次のメールアドレスTextFieldに自動的に移動します。
キーボードの次のボタンを設定して次のキーボードにジャンプする方法はありますか?
ありがとう
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 、特にキーボードの下にあるコンテンツの移動)をお読みください。
@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;
}
}
正解の迅速なバージョン。
私の経験では、textFieldsを切り替えるときにresignFirstResponderを使用する必要はありません。
この例では、基本的なユーザー名とパスワードのtextFieldsのみです。
ストーリーボードのユーザー名のキーボード「リターンキー」は「次へ」に設定され、パスワードのキーボードは「完了」に設定されます。
次に、これらの2つのテキストフィールドのデリゲートを接続し、この拡張機能を追加するだけで完了です。
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == textFieldPassword {
self.view.endEditing(true)
} else {
textFieldPassword.becomeFirstResponder()
}
return true
}
}
より一貫した堅牢な方法は、 NextResponderTextField を使用することです。これは、インターフェイスビルダーから完全に構成できます。
あなたがする必要があるのは
UITextField
のクラスタイプをNextResponderTextField
に設定します nextResponderField
のアウトレットを、次のレスポンダーを指すように設定します。次のレスポンダーは、UITextField
またはUIResponder
サブクラスになります。 UIButtonにすることもでき、ライブラリはボタンが有効な場合にのみボタンのTouchUpInside
イベントをトリガーするのに十分スマートです。 動作中のライブラリは次のとおりです。
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)
}
}
- (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;
テキストフィールドのアウトレットを作成してから、
viewController.h
(IBAction)textFieldDoneEditing:(id)sender;
viewController.m
(IBAction)textFieldDoneEditing:(id)sender {
[textField resignFirstResponder];
if (textField == nameField) {
[emailField becomeFirstResponder];
}
}
(接続インスペクタを表示>送信イベント)didEndOnExitとtextFieldDoneEditingの関係を作成します