2017-08-09 1 views
3

私はXIBファイルの2つの垂直スタックビューで構成された登録フォームにたくさんのテキストフィールドを持っています。シミュレータでアプリを実行するときにTabキーを押すと、iOSが自動的に次のテキストフィールドに移動することに気付きました。シミュレータでTabキーを押したときに、次にフォーカスするテキストフィールドをiOSがどのように決定するのですか?

しかし、これは時々動作しません、なぜ私は不思議に思っていました。時々、システムは、その下のフィールドではなく、別のスタックビューからテキストフィールドをフォーカスします。

(ソフトウェアキーボードで[次へ]を押したとき)私はすでにこのように次のテキストフィールドの連鎖を設定している:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    NSUInteger index = [self.textFields indexOfObject:textField]; 
    if (index != NSNotFound) { 
     if (index == self.textFields.count - 1) { 
      [textField resignFirstResponder]; 
      [self createAccount]; 
     } else { 
      UITextField *nextTextField = self.textFields[index + 1]; 
      [nextTextField becomeFirstResponder]; 
     } 
     return NO; 
    } 
    return YES; 
} 

textFieldsは、この画面は上から下に持っているすべてのテキストフィールドの配列です。

ちょっとした文字を入力し、追加のマウスクリックをせずにTabキーを押すだけで、フォームをすばやく入力できます。出来ますか?

この「タブスイッチ」の間に-textFieldShouldReturnが呼び出されないため、次の最初のレスポンダになるテキストフィールドを制御できません。彼らに正しい順序で集中させるためのトリックは何ですか?

+0

[テキストフィールド(次/完了ボタン)をナビゲートする方法](https://stackoverflow.com/questions/1347779/how-to-navigate-through-textfields-next-done-buttons)の可能な複製 – atulkhatri

+0

'self.textFields'をもう一度確認してください。多分それは間違った順序を持っています。または、refを削除してから、必要な順序で再度接続してみてください。 – anhtu

+0

このトピックのもう1つの興味深い貢献:https://stackoverflow.com/a/6177614/6319106 – clemens

答えて

0

indexOfObject:から返されるインデックスを確認してください。配列内に等しいオブジェクトがいくつかある場合、このメソッドは最初のオブジェクトのインデックスを返します。

インデックスが間違っている場合は、次のようにUITextFieldののタグプロパティを使用します。

UITextField * nextResponder = [self.textFields objectAtIndex:textField.tag + 1]; 

したり、テキストフィールドのすべての場合は、同じスーパーである:

UITextField * nextResponder = (UITextField*)[textField.superview viewWithTag:textField.tag + 1]; 

アップルのドキュメント:

インデックス0から始まって、配列の各要素は、一致が見つかるまで、または配列の終わりに達するまで、オブジェクトに送信されるisEqual:メッセージに引数として渡されます。 isEqual:(NSObjectプロトコルで宣言されている)がYESを返すと、オブジェクトは等しいとみなされます。 https://developer.apple.com/documentation/foundation/nsarray/1417076-indexofobject?language=objc

このメソッドは、インスタンスが等しくなることを定義します。たとえば、コンテナオブジェクトは、対応するオブジェクトがすべてisEqual:要求に対してYESと応答する場合、2つのコンテナを等しいものとして定義することができます。このメソッドの使用例については、NSData、NSDictionary、NSArray、およびNSStringクラスの仕様を参照してください。

2つのオブジェクトが等しい場合は、同じハッシュ値を持つ必要があります。この最後の点は、サブクラスでisEqual:を定義し、そのサブクラスのインスタンスをコレクションに入れる場合に特に重要です。サブクラスでハッシュも定義していることを確認してください。 https://developer.apple.com/documentation/objectivec/1418956-nsobject/1418795-isequal?language=objc

関連する問題