1

初心者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 から解決するためのいくつかのアイデア:

  1. textFieldShouldReturn: で textFieldsArray を設定するのはなぜですか? これは、初期化が行われる場所 (ビュー コントローラーの viewDidLoad など) で行うべきではありませんか? 問題は、アレイが実際にはセットアップされていないか、部分的にしかセットアップされていないことです。また、セットアップをここに配置すると、何度も呼び出され、そのたびに配列が変更され、物事が台無しになります。
  2. タグが 1 つずれています。それらを 1 ではなく 0 から割り当てる必要があります (または、inputAccessoryViewDidSelectNext: の違いを説明します)。コードが機能していた場合、最初のフィールドがタグ 1 を返すため、2 つのテキスト フィールドをスキップし、3 番目のフィールドである objectAtIndex:2 にスキップします。
  3. あなたは終わりから外れることを説明していません。最後のフィールドにいる場合、インクリメントは最初に戻りません。

実際には、タグをまったく使用しないことをお勧めします。代わりに、セットアップ時に、フィールドをループして配列に順番に追加します。次に、inputAccessoryViewDidSelectNext: で、高速な列挙の代わりにカウンターを使用して、現在地を特定します。

4

3 に答える 3

3
  1. なぜあなたはあなたをセットアップしているtextFieldsArraytextFieldShouldReturn:ですか?これは、初期化が行われる場所(viewDidLoadView Controllerなど)で行うべきではありませんか?問題は、アレイが実際にセットアップされていないか、部分的にしかセットアップされていないことである可能性があります。また、セットアップをここに置くことは、それが何度も呼び出され、毎回配列を変更し、物事を台無しにすることを意味します。
  2. タグが1つずれています。1ではなく0から開始して割り当てる必要があります(またはの違いを考慮に入れる必要がありますinputAccessoryViewDidSelectNext:)。コードが機能している場合、最初のフィールドはタグ1を返すため、2つのテキストフィールドをスキップし、3番目のフィールドであるobjectAtIndex:2にスキップします。
  3. あなたは終わりを脱することを説明していません。最後のフィールドにいる場合、インクリメントは最初に戻りません。

実際には、タグをまったく使用しないことをお勧めします。代わりに、セットアップ時に、フィールドをループして、配列に順番に追加します。次に、でinputAccessoryViewDidSelectNext:、高速列挙の代わりにカウンターを使用して、現在地を特定します。

于 2012-11-02T14:52:57.580 に答える
1

textFieldsを持つために配列を使用せず、代わりにtableViewのセルからtextFieldsを取得することをお勧めします。

あなたはこのようにすることができます、

textFieldsタグを、それが含まれるセルのindexPathで設定します。

次に、textFieldDidEndデリゲートを使用します。タグから次のテキストフィールドのセルを取得し、後でセルからテキストフィールドを取得して最初のレスポンダーにします。

FDInputAccessoryView以下の方法でセルを取得できる場合は、ここでも取得できます。

- (void) inputAccessoryViewDidSelectNext:(FDInputAccessoryView *)view`
于 2012-11-02T14:57:03.147 に答える
1

ドキュメントによると、「[高速] 列挙は「安全」です。列挙中にコレクションを変更しようとすると、例外が発生するように、列挙子にはミューテーション ガードがあります。」それがおそらくうまくいかない理由です。おそらく、通常の while ループで同じことを達成できます。

于 2012-11-03T03:23:15.243 に答える