1

次の状況: UITableView から行を削除したいのですが、これは常にクラッシュします...

@property (nonatomic,retain) NSMutableArray *daten;

@synthesize daten;

次に、viewDidLoad で配列を埋めます。

-(NSMutableArray *) daten{
if (!daten) {
    self.daten = [[NSMutableArray alloc] init];
}

@try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [self getDBPath];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
    {
        NSLog(@"An error has occured: %s", sqlite3_errmsg(db));

    }


    const char *sql = "SELECT * FROM  Daten";
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
    }else{

        while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
            Daten * infos = [[Daten alloc] init];
            infos.download = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
            infos.upload = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];
            infos.ping = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,3)];
            infos.comment = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,4)];
            infos.date = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,5)];
            infos.type = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,6)];
            infos.lati = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,7)];
            infos.longi = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,8)];


            [daten addObject:infos];
        }
    }
}
@catch (NSException *exception) {
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}
@finally {
    sqlite3_finalize(sqlStatement);
    sqlite3_close(db);

    return daten;
}
}

行を削除したい場合:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the row from the data source
    //[self.daten removeAllObjects];
    NSString *selectedCategory = [self.daten objectAtIndex:indexPath.row];
    NSLog(@"there are %d objects in the array", [self.daten count]);
    [self.daten removeObjectAtIndex:indexPath.row]; //we assume, that mySourceArray is a NSMutableArray we use as our data source
    NSLog(@"there are %d objects in the array", [self.daten count]);

    [self.tableView beginUpdates];

    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    [self.tableView endUpdates];

....}

私の配列カウントが同じものを削除する前後であるため、クラッシュします! しかし、なぜだかわかりません...

私の NumberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

// Return the number of rows in the section.
return [self.daten count];


}

例外は次のとおりです。

2012-10-15 16:45:13.778 Speedcheck[5297:907] *** Assertion failure in -[UITableView         _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2372/UITableView.m:1070

2012-10-15 16:45:13.779 Speedcheck[5297:907] * キャッチされない例外 'NSInternalInconsistencyException' によるアプリの終了、理由: '無効な更新: セクション 0 の行数が無効です。既存のセクションに含まれる行数更新後 (26) は、更新前にそのセクションに含まれていた行数 (26) に、そのセクションから挿入または削除された行数 (0 挿入、1 削除) をプラスまたはマイナスした値に等しくなければなりません。そのセクションに移動した、またはそのセクションから移動した行数 (移動した行数 0、移動した行数 0)。*First throw call stack: (0x3adcf3e7 0x35934963 0x3adcf29d 0x390c67b3 0x36569ba1 0x82311 0x366fefe1 0x3662003f 0x3661fff3 0x3661ffcd 0x3661f883 0x3662003f 0x3661fff3 0x3661ffcd 0x3661f883 0x3661fd71 0x365485c1 0x365358a9 0x365351b7 0x3ac025f7 0x3ac02227 0x3ada43e7 0x3ada438b 0x3ada320f 0x3ad1623d 0x3ad160c9 0x3ac0133b 0x36589289 0x51d33 0x34984b20) libc++abi.dylib: terminate called throwing an exception

4

4 に答える 4

3

問題はあなたの-(NSMutableArray *) daten方法にあるようです。

遅延初期化を実行したいように見えますが、実際には、このメソッドが呼び出されるたびに、配列が再構築されます。したがって、削除は、次にアレイにアクセスするまで、アレイが再びいっぱいになるまでのみ有効です(アレイが大きくなり、大きくなるように見えます)。

あなたは次のようなものが欲しいかもしれません

-(NSMutableArray *) daten{
   if (daten)
      return daten;

   self.daten = [[NSMutableArray alloc] init];

   // ... same setup as before

}

代わりは。

于 2012-10-15T14:56:16.290 に答える
1

私には意味がないので、それが役立つかどうかはわかりませんが[self.daten removeObjectAtIndex:indexPath.row];、呼び出しの直後に を入れて[self.tableView beginUpdates];、結果を報告してください!

于 2012-10-15T14:44:13.450 に答える
0

UITableViewからセルを削除する最も簡単な方法は、データ配列からオブジェクトを削除することです。

次の手順を実行してください。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        NSInteger rowNumber = indexPath.row;

        [self.daten removeObjectAtIndex:rowNumber];

        [tableView reloadData];
    }
}
于 2012-10-15T14:59:11.123 に答える
0

あなたはほとんどそれを持っています。あなたが本当に考えたいのは、編集スタイルをチェックした直後にこの行を置くことです:

if (editingStyle == UITableViewCellEditingStyleDelete) {

[self.tableView beginUpdates];

これは、beginUpdatesブロックでモデルの変更を実行する必要があるためです。そうしないと、その不整合が発生します。

于 2012-10-15T14:59:40.877 に答える