1

4 つのセクションに分かれた約 20 の異なるフィールドを含む登録フォームを作成しようとしています。そのためのカスタムセルを作成しました。これにはラベルとUITextFieldが含まれており、テーブルビューにラベルの名前とテキストフィールドのタグを示す辞書の配列があります(タグによっては、UIPicker を使用してデータを入力します)。

問題は、フィールドの編集を開始すると、下にスクロールしてすべてをバックアップすると、すべてが台無しになり、フィールドで変更されるべきではないということです...セルをデキューしているため、これは明らかに起こっていることに気づきました。重複した参照を作成するので、毎回新しいセルを作成しようとしましたが、必要なセルの正確な量でテーブルビューを初期化するだけで、内容(ラベルもテキストフィールドも)を持たない空白のセルだけを初期化するため、うまくいきません。 .

ボタンが押されたときに値を取得する必要があるという事実を考慮して、セルごとに異なるメモリ参照を保持できるようにする最も簡単な方法は何でしょうか?

この投稿の提案を読みましたが、セルの配列を作成する方法についてはまだわかりません。

何か助けはありますか?

これは私の定義のコードです:

NSArray *section1 = [[NSArray alloc] initWithObjects:
                     [NSDictionary dictionaryWithObjectsAndKeys:@"100",@"tag",@"Title",@"title",@"title",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"First Name",@"title",@"first_name",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Last Name",@"title",@"last_name",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Job Title",@"title",@"job_title",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Email",@"title",@"email",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Email",@"title",@"confirm_email",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Password",@"title",@"password",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Password",@"title",@"conf_password",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Phone",@"title",@"phone",@"fieldName",nil],
                     nil];

....

self.formItems = [[NSArray alloc] initWithObjects:
                  section1,
                  section2,
                  section3,
                  section4,
                  section5,
                  nil];

そして、cellForRowAtIndexPath で使用するコードは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"freeTrialFormCell";
    TSIFreeTrialFormCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section];
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row];

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) {
        cell.textField.secureTextEntry = YES;
    }

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"];
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"];
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue];
    cell.label.text = [myFieldInfo objectForKey:@"title"];

    return cell;
}
4

2 に答える 2

0

UITableView は、上下にスクロールするときにセルを再利用するため、そのセルにのみ入力された情報が失われます。私がしているのは、それらのセルの入力を保持する配列を作成することです。

基本的:

enteredText = [[NSMutableArray alloc] init]; //iVar, not local variable
for (int i=0; i<numTableRows; i++) {
   [enteredText addObject:@""]; //fill with dummy values that you will replace as user types
}

次に、テーブル ビューのテキスト フィールドで、自分自身をテキスト フィールドのデリゲートとして設定し、 を実装しtextFieldDidEndEditingます。enteredTextそのメソッドで、その行の値をユーザーのテキストに置き換えます。

セルを作成するときは、テキスト フィールドのテキストを配列の値に設定します。

myCell.textField.text = [enteredText objectAtIndex:indexPath.row];

最初は空白で、ユーザーが何かを入力すると、ユーザーのテキストが保持されます。

于 2012-11-29T16:20:26.670 に答える
0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        TSIFreeTrialFormCell *cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease];

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section];
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row];

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) {
        cell.textField.secureTextEntry = YES;
    }

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"];
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"];
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue];
    cell.label.text = [myFieldInfo objectForKey:@"title"];

    return cell;
}

ただし、各行のセルを作成しているため、パフォーマンスが低下します

于 2012-11-29T15:50:13.927 に答える