初心者obj-cの質問です。
4 つのカスタム セルを含むカスタム テーブルビューがあります。すべてのセルには、顧客情報用の編集可能なテキスト フィールドがあります。入力アクセサリ ビューによるテキスト フィールド間の切り替えを改善する必要があります。 http://uaimage.com/image/62f08045
容量 4 の NSMutableArray を作成しました。テキスト フィールドにタグを付けて、テキスト フィールド デリゲート メソッドのこの配列に追加しました。
- (BOOL) textFieldShouldReturn:(UITextField *)textField {
FDTextFieldCell *cell = (FDTextFieldCell *)[textField superview];
NSIndexPath *indexPath = [[self tableView] indexPathForCell:cell];
if ([indexPath section] == 0) {
if ([indexPath row] == 0) {
[[FDProfile sharedProfile] setName:[textField text]];
[textField setTag:1];
[textFieldsArray insertObject:textField atIndex:0];
} else if ([indexPath row] == 1) {
[[FDProfile sharedProfile] setSurname:[textField text]];
[textField setTag:2];
[textFieldsArray insertObject:textField atIndex:1];
} else if ([indexPath row] == 2) {
[[FDProfile sharedProfile] setNickname:[textField text]];
[textField setTag:3];
[textFieldsArray insertObject:textField atIndex:2];
} else if ([indexPath row] == 3) {
[[FDProfile sharedProfile] setEmail:[textField text]];
[textField setTag:4];
[textFieldsArray insertObject:textField atIndex:3];
[textField resignFirstResponder];
}
}
[[self tableView] reloadData];
return YES;
}
ここで、「次へ」ボタンの機能を改善しようとしています。
- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view {
for (UITextField *textField in [self textFieldsArray]) {
if ([textField isFirstResponder]) {
textField = [[self textFieldsArray] objectAtIndex:textField.tag + 1];
[textField becomeFirstResponder];
}
}
}
しかし、このコードは機能しません。高速列挙の使用に問題があると思いますか?
誰かがこれを手伝ってくれますか? ありがとう、アレックス。
c-had から解決するためのいくつかのアイデア:
- textFieldShouldReturn: で textFieldsArray を設定するのはなぜですか? これは、初期化が行われる場所 (ビュー コントローラーの viewDidLoad など) で行うべきではありませんか? 問題は、アレイが実際にはセットアップされていないか、部分的にしかセットアップされていないことです。また、セットアップをここに配置すると、何度も呼び出され、そのたびに配列が変更され、物事が台無しになります。
- タグが 1 つずれています。それらを 1 ではなく 0 から割り当てる必要があります (または、inputAccessoryViewDidSelectNext: の違いを説明します)。コードが機能していた場合、最初のフィールドがタグ 1 を返すため、2 つのテキスト フィールドをスキップし、3 番目のフィールドである objectAtIndex:2 にスキップします。
- あなたは終わりから外れることを説明していません。最後のフィールドにいる場合、インクリメントは最初に戻りません。
実際には、タグをまったく使用しないことをお勧めします。代わりに、セットアップ時に、フィールドをループして配列に順番に追加します。次に、inputAccessoryViewDidSelectNext: で、高速な列挙の代わりにカウンターを使用して、現在地を特定します。