2013-08-20 3 views
3

저는 fmdb를 사용하여 일반 UITableView에 표시되는 일부 데이터를 관리하고 있습니다. 이 코드를 사용하여 하나의 셀을 삭제하려고합니다.UITableView에서 UITableViewCell 삭제

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     db = [FMDatabase databaseWithPath:[Utility getDatabasePath]]; 


     [db open]; 

     [db beginTransaction]; 

     NSString * stringtoInsert = [NSString stringWithFormat: @"DELETE FROM TTLogObject WHERE id='%@'", [idArray objectAtIndex:indexPath.row]]; 

     BOOL success = [db executeUpdate:stringtoInsert]; 

     if (!success) 
     { 
      NSLog(@"insert failed!!"); 
     } 

     NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]); 

     [db commit]; 

     [db close]; 

     [self getList]; 
    } 
} 

다음은 현재 사용하고있는 viewDidLoad 및 getList 코드의 코드입니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationController.navigationBar.tintColor = [UIColor blackColor]; 

    shipperCityArray = [[NSMutableArray alloc] init]; 
    pickupDateArray = [[NSMutableArray alloc] init]; 
    paidArray = [[NSMutableArray alloc] init]; 
    idArray = [[NSMutableArray alloc] init]; 

    //NSString *path = [[NSBundle mainBundle] pathForResource:@"tt" ofType:@"db"]; 


    [self getList]; 

} 

- (void)getList 
{ 
    db = [FMDatabase databaseWithPath:[Utility getDatabasePath]]; 
    [shipperCityArray removeAllObjects]; 
    [pickupDateArray removeAllObjects]; 
    [paidArray removeAllObjects]; 
    [idArray removeAllObjects]; 

    [db open]; 

    FMResultSet *fResult= [db executeQuery:@"SELECT * FROM TTLogObject"]; 


    while([fResult next]) 
    { 
     [shipperCityArray addObject:[fResult stringForColumn:@"shipperCity"]]; 
     [pickupDateArray addObject:[fResult stringForColumn:@"pickupDate"]]; 
     [paidArray addObject:[NSNumber numberWithBool:[fResult boolForColumn:@"paid"]]]; 
     [idArray addObject:[NSNumber numberWithInteger:[fResult intForColumn:@"id"]]]; 
     NSLog(@"%@", [NSNumber numberWithInteger:[fResult intForColumn:@"id"]]); 
    } 


    [db close]; 

    [self.tableView reloadData]; 
} 

문제는 데이터가 데이터베이스에서 삭제된다는 것입니다. 그러나 삭제를 누르면 테이블보기에 셀이 더 이상 표시되지 않습니다. 앱을 다시 시작하면 올바른 데이터가 다시로드되고 삭제 된 셀은 실제로 사라집니다. 나는 그것이 numberOfRowsInSection와 관련이 있다고 생각합니다.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"%i", [shipperCityArray count]); 
    return [shipperCityArray count]; 
} 

앱이 실행되면 적절한 양의 셀이 인쇄되지만 삭제가되면 아무 것도 인쇄되지 않고 호출되지 않는 것 같습니다.

나는 [self.tableView beginUpdates][self.tableView endUpdates]을 사용하려고 시도했지만, 삭제 한 후에 잘못된 항목 수에 대해 설명하는 것은 오류로 보입니다. 이 문제를 해결하는 방법을 모르겠습니다. beginUpdates 및 endUpdates를 사용해야하는 경우 누군가가 이것이 올바르게 수행되어야하는 방법과 실제로 진행되는 작업을 설명 할 수 있습니까?

답변

4

reloadData를 호출하는 대신 명시 적으로 tableView에 셀을 삭제한다고 알려야합니다.

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 

[self.tableView reloadData]; 

교체 당신은 당신의 commitEditingStyle 방법이를 호출해야합니다.

+0

나는 이것을 사용하려고 시도하고 있는데, 나는 무엇을 deleteRowsAtIndexPaths에 전달 하는가? 지금 당장 코드 줄을 그대로두면 다음 오류가 발생합니다. - [NSIndexPath count] : 인식 할 수없는 selector가 인스턴스 0x7566e50에 전송되었습니다. 2013-08-19 22 : 57 : 28.808 Trucking Tracker [13861 : c07] ** * 'NSInvalidArgumentException', 이유 : 'NSIndexPath count : 인스턴스로 전송 된 인식 할 수없는 셀렉터 0x7566e50' – user1933131

+0

인덱스 경로가 하나가 아니라 배열이므로 하나의 요소 배열을 가져야합니다. 방금 업데이트 했어. 미안해. –

+0

아, 나는 그것을 시도했다. 그리고 캐치 예외를 'NSInternalInconsistencyException'이유로 응용 프로그램을 종료하는 이유 : '유효하지 않은 업데이트 : 0 번째 행의 행 수가 잘못되었습니다. 이후에 기존 섹션에 포함 된 행 수 update (2)는 update (2) 이전에 해당 섹션에 포함 된 행 수와 같거나 그 섹션 (삽입 된 0, 삭제 된 1)에서 삽입되거나 삭제 된 행 수를 더한 수 또는 빼기 수와 같거나 같아야합니다 (0은 이동, 0은 밖으로 이동). " – user1933131

관련 문제