0

KMInputCellUITextFieldsを持つカスタム UITableViewCells (タイプ ) を持つ任意の量の行が存在する 1 つのセクションを持つ単純な UITableView があります。ユーザーが最後の (空白の) テキスト フィールドに入力を開始すると、新しい空白行が挿入されます (これにより、ユーザーはリストのような構造を作成できます)。ビューを閉じたときにのみデータを「保存」するので、データ ソースはNSUInteger行数を追跡するだけです。

ユーザーがテーブルから行を削除するまで、私のコードは正常に動作します。次に、ユーザーがリストの最後で入力を開始し、新しい (空白の) 行を挿入する必要がある場合、挿入された UITableView セルには、削除されたセルからの古いデータが含まれます。さらに悪いことに、複数の行が削除された後でユーザーが入力を開始すると (そして 1 つの空白行を挿入する必要があります)、削除された複数の行が突然存在するようになります。

以下はfieldChanged:、セル内の UITextFields の 1 つが編集されたときに呼び出されるメソッドです (self.last_cellセクション内の最後のセルを返します)。

- (IBAction)fieldChanged:(id)sender {
    // get the text field of the last row
    // if it has a value that is not blank, insert another row
    KMInputCell* last_cell = self.last_cell;
    if(![last_cell.textField.text isEqualToString:@""]){
        [self.tableView beginUpdates];
        NSIndexPath* new_cell_path = [NSIndexPath indexPathForItem:[self.tableView numberOfRowsInSection:0] inSection:0];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:new_cell_path] withRowAnimation:UITableViewRowAnimationAutomatic];
        number_emails++;
        [self.tableView endUpdates];
    }
}

commitEditingStyle:セルを削除するために使用されるメソッドは次のとおりです。

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        number_emails--;
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
     }   
}

添加

ここにあるcellForRowAtIndexPath:

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

    // Configure the cell...

    return cell;
}
4

2 に答える 2

1

データモデルの詳細については正確にはわかりません...整数を追跡するだけでは、実際には優れたアプローチではありませんが、おそらくあなたが何をしているのか理解できません. これらの行を表すモデル配列またはモデル オブジェクトがありますか、それともフィールド内のテキストを追跡しているだけですか?

新しい行を挿入していますが、表示時に UITableViewCells が再利用されるという事実に問題がある可能性があります。それが実際にここでの問題である場合は、ここで提供していないメソッドを更新する必要がある場合があります。

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

    // Configure the cell...

    return cell;
}

これは、テキスト フィールドの入力に使用している方法です。同様に、動的フィールドの内容を明示的にクリアして、表のセルが再利用されたときに予期しない内容が含まれないようにする必要があります。

更新しました

テキスト フィールド自体は、データの保持には適していません。ここの問題からわかるように、アーキテクチャはそれを排除します。これは、セルが画面上でスクロールしたりオフになったりする (または削除/追加される) ときにセルが再利用されるためです。アクションの 1 つの方法は、配列を作成し、これらのテキスト フィールドの内容をその中に文字列として格納することです。

于 2013-01-10T22:59:56.510 に答える
0

cellForRowIndex関数では、それらを初期化してnilに戻します。これで問題が解決します。

于 2013-01-11T07:04:38.760 に答える