0

私は問題で立ち往生しています.5行のuitableviewがあります。ユーザーが1行を選択すると、タップされた行の真下に新しい行が作成/挿入され、アニメーションが表示されます(セクションの非表示/非表示で見たように) )、新しく挿入された行をタップすると削除されます。

私は試してみましたが、それは言う


Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid  
update: invalid number of rows in section 0.  The number of rows contained in an existing section 
after the update (6) must be equal to the number of rows contained in that section before the update 
(5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).'

この機能を実現する他の方法は何ですか?前もって感謝します。

4

2 に答える 2

2

最初は5行あります。テーブルに新しい行を追加します。たとえば、addRowsAtIndexPaths: メソッドを使用します。この時点で、この新しいセルを追加する必要があるため、テーブル ビューはそのデータソース メソッドを呼び出します。

しかし、おそらく、データソース メソッドから行数を 5 (6 ではなく) 返している可能性があり、その結果、矛盾が生じました (テーブル ビューは 6 行を想定し、まだ 5 行を返しているため)。

したがって、テーブル ビューが新しく作成されたセル (行 = 5) に対して cellForRowAtIndexPath: メソッドを呼び出すと、次のようなことをしなければならないため、クラッシュする可能性があります。

[yourDatasourceArray objectAtIndex:indexPath.row];

indexPath.row が 5 で、配列にはまだ 5 つのオブジェクト (インデックス 0 から 4) があるため、上記のステートメントはクラッシュします。したがって、objectAtIndex:5 はクラッシュを引き起こします。

于 2011-07-09T07:00:12.950 に答える
0

- (NSInteger)numberOfRowsInSection:(NSInteger)section {
    switch (section) {
        case 0:
            return numberOfRows;
    }
    return 0;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    numberOfRows ++;
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    NSMutableArray*  tempArray = [[NSMutableArray alloc] init];
        [tempArray addObject:[NSIndexPath indexPathForRow:indexPath.row +1  inSection:indexPath.section]];
    [tableView beginUpdates];
    [tableView insertRowsAtIndexPaths:tempArray withRowAnimation:UITableViewRowAnimationRight];
    [tableView endUpdates]; 
    [tempArray release];

}



2つの間違いを犯していました1)更新後に[tableViewbeginUpdates]と明らかに[tableViewendUpdates]を使用していませんでした2)newRowのインデックスパスを計算する方法があいまいでした。

時間と労力を費やしてくれたpratikshabhisikarとMaxHowellに感謝します。

于 2011-07-10T09:32:23.473 に答える