2017-10-17 25 views
0

私は、セルの削除中にcsvファイルを削除しようとしている、しかし、私は削除押されたときに、私は次のエラーを取得しています:UITableView - セルを削除している間にファイルを削除する方法は?

Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' * First throw call stack:

コード:

// 

/

/ CameraViewController.m 
// oFiOSstoryboard 
// 
// Created by Dorald on 24/05/15. 
// 
// 

#import "CameraViewController.h" 
#import "resultsDetailView.h" 


@interface CameraViewController() 

@property (strong, nonatomic) IBOutlet UITableView *data; 
@property (retain, nonatomic) IBOutlet UILabel *timeStamp; 
@property (strong,nonatomic) NSMutableArray *dirList; 
@property (nonatomic, assign) NSString *csvRow; 

@property (nonatomic, strong) NSMutableArray *dataArray; 


- (IBAction)didTapDeleteBtn:(id)sender; 


@end 

           ////////////////////////csv readder 
NSMutableArray *tableDataArray; 

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSFileManager *manager = [NSFileManager defaultManager]; 
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot]; 
NSString *filename; 
NSMutableArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
NSString *strPath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"csv"]; 
NSString *strFile = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil]; 
NSMutableArray *timeStampb = [[NSMutableArray alloc] init]; ; 
NSMutableArray *arrayToDelete = [[NSMutableArray alloc] init]; ; 
NSMutableArray *filePathsArray ; 
//NSMutableArray *dirList= [[NSMutableArray alloc] init]; ; 
NSString *currentcsvfile; 
NSString *csvfilenameSave; 

@implementation CameraViewController 



@synthesize data; 


- (void)viewDidLoad { 
[super viewDidLoad]; 
    // ////lista de documentos 

    self.data.scrollEnabled = YES; 

    self.data.delegate = self; 
    self.data.dataSource = self; 


    //filePathsArray =[[NSMutableArray alloc] init]; ; 


    self.data.allowsMultipleSelectionDuringEditing = YES; 


    self.dataArray = [[NSMutableArray alloc]init]; 
    NSInteger count = 100; 
    for (NSInteger i = count; i>=0; i--) { 
     NSString *title = [NSString stringWithFormat:@"cell %ld",i]; 
     [self.dataArray addObject:title]; 
    } 
    NSMutableArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSFileManager *manager = [NSFileManager defaultManager]; 
    NSMutableArray* fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; 
    //--- Listing file by name sort 
    NSLog(@"\n File list %@",fileList); 

    //---- Sorting files by extension 
    NSMutableArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF EndsWith '.csv'"]; 
    filePathsArray = [filePathsArray filteredArrayUsingPredicate:predicate]; 
    NSLog(@"\n\n Sorted files by extension %@",filePathsArray); 



    self.dirList = [filePathsArray mutableCopy]; 

    NSString *docPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 

    if (!strFile) { 
     NSLog(@"Error reading file."); 
    } 

    [timeStampb release]; 


     timeStampb = [[NSMutableArray alloc] initWithArray:[strFile componentsSeparatedByString:@"\,"]]; 
     // this .csv file is seperated with new line character 
     // if .csv is seperated by comma use "," instesd of "\n" 
    for(NSString *countryname in timeStampb) { 
     NSLog(@"%@", timeStampb); 

    } 


    } 


////////////////////////////////////////////////////////////////Delete csv files 
//- (IBAction)delet:(id)sender { 
// NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 
//  
// NSString *filePath = [docPath stringByAppendingPathComponent:@"jorge.csv"]; 
// NSError *error = nil; 
// [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 
//} 




- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 


# pragma – mark table view DataSource Methods 
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 

    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.dirList count]; 

} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier ]; 
    if (cell == nil) { 

     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 

     UIColor* color = [UIColor colorWithRed:(254.0/255.0) green:(251.0/255.0) blue:(248.0/255.0) alpha:1]; 
     UIView *bgColorView = [[UIView alloc] init]; 

     bgColorView.backgroundColor = [UIColor colorWithRed:(253.0/255.0) green:(0.0/255.0) blue:(237.0/255.0) alpha:1]; 


     [cell setSelectedBackgroundView:bgColorView]; 
     cell.backgroundColor = color; 
    } 

    cell.textLabel.text = [timeStampb objectAtIndex:indexPath.row]; 
    cell.detailTextLabel.text = [self.dirList objectAtIndex:indexPath.row]; 


    cell.textLabel.textColor = [UIColor colorWithRed:(0.0/255.0) green:(0.0/255.0) blue:(0.0/255.0) alpha:1]; 
    cell.textLabel.font=[UIFont systemFontOfSize:8.0]; 

    cell.detailTextLabel.font=[UIFont systemFontOfSize:15.0]; 
    cell.detailTextLabel.textColor = [UIColor colorWithRed:(235.0/255.0) green:(120.0/255.0) blue:(33.0/255.0) alpha:1]; 



    return cell; 


} 



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



    NSLog(@"%d", indexPath.row); 


     currentcsvfile = [self.dirList objectAtIndex:indexPath.row ];; 

    csvfilenameSave = [NSString stringWithFormat:currentcsvfile]; 


    NSArray *paths3 = NSSearchPathForDirectoriesInDomains 
    (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory3 = [paths3 objectAtIndex:0]; 

    //make a file name to write the data to using the documents directory: 
    NSString *fileName = [NSString stringWithFormat:@"%@/currentcsvnamefile.txt", 
          documentsDirectory3]; 
    //create content - four lines of text 
    NSString *content =csvfilenameSave; 
    //save content to the documents directory 
    [content writeToFile:fileName 
       atomically:NO 
       encoding:NSStringEncodingConversionAllowLossy error:nil]; 

    [_dirList addObject:_dirList[indexPath.row]]; 


    NSLog(@"\n current csv csvfilenameSave % ",csvfilenameSave); 



//[self performSegueWithIdentifier:@"detailsegue" sender:self]; 

} 

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Update the delete button's title based on how many items are selected. 
    [_dirList removeObject:_dirList[indexPath.row]]; 



} 


-(UITableViewCellEditingStyle)data:(UITableView *)data editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    return UITableViewCellEditingStyleDelete; 
} 


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

     [self.data deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [data setEditing:NO animated:YES]; 


     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 

     NSString *filePath = [docPath stringByAppendingPathComponent:[self.dirList objectAtIndex:indexPath.row ]]; 
     NSError *error = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 

     [_dirList removeObjectAtIndex:indexPath.row]; 




    } 
} 

#pragma mark - UITableView Delegate Methods 

//- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
//{ 
// return UITableViewCellEditingStyleDelete; 
//} 


#pragma mark - Delete Button Action 


#pragma mark – TableView delegate 

- (void)dealloc { 
    [_timeStamp release]; 

    [self.dirList release]; 
    self.data.delegate = nil; 
    self.data.dataSource = nil; 


    [super dealloc]; 
} 
@end 
+0

あなたの配列リストを表示します - 'self.dirList'。 '[_dirList removeObjectAtIndex:indexPath.row];' –

+0

私が成功裏に使用するアプローチは、ディレクトリの変更を監視し、ディレクトリ内のファイルを表示することです - 削除とは無関係に/ rename/create操作。したがって、ファイル関連のアクションが発生すると、変更がファイルシステムに反映されると、TableViewが更新されます。 –

+0

なぜあなたは 'didDeselectRowAtIndexPath'の配列からオブジェクトを削除していますか? – Lion

答えて

0

実際に何をしているのかは、配列の一番上の値を削除しています。この関数の最後に配列から値を削除する必要があります。私が以下のコードで行ったように、私の答えをチェックし、このコードを使用して、あなたが問題に直面しているかどうか教えてください。私の答えを更新してくださいもう一度それを確認してください。方法[self.data deleteRowsAtIndexPaths:withRowAnimation:];

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

    currentcsvfile = [self.dirList objectAtIndex:indexPath.row]; 

    csvfilenameSave = [NSString stringWithFormat:currentcsvfile]; 

    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 

    NSString *filePath = [docPath stringByAppendingPathComponent:csvfilenameSave]; 
    NSError *error = nil; 
    [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 

    [_dirList removeObjectAtIndex:indexPath.row]; 

    [self.data beginUpdates]; 

    [self.data deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [self.data endUpdates]; 

    [data setEditing:NO animated:YES]; 

    } 
} 
+0

こんにちは!理由: '無効な更新:セクション0の行数が無効です。更新(4)の後に既存のセクションに含まれる行の数は、次の値と同じでなければなりません:' NSInternalInconsistencyException '更新(4)の前に、そのセクションに含まれている行 – Alivajorg

+0

@ Alivajorg今、あなたはそれを試すことができます、私はちょうどそれを更新します。私は私の答えでそれを追加しなかったappoloize。 –

+0

@ Alivajorg、あなたは、テーブルビューの行の数とセクションの数のような質問のすべてのテーブルビューのコードを追加できますか?そのデータソースメソッドを使用している場合 –

0

コールは、そのプレゼンテーションを調整するために、テーブルビューにメッセージを送信し、_dirListカウントがtableviews行数に等しくないので、このようにテーブルビューはNSInternalInconsistencyExceptionをスロー。 withRowAnimation:テーブルビューに詳しく

は、最初に_dirListアレイから 行に対応する項目を削除した後deleteRowsAtIndexPathsを送信することによって、この資料Inserting and Deleting Rows and Sections

これを扱うことができる見て。

- (void)tableView:(UITableView *)tableView commitEditingStyleメソッド内のコードの行の下に置き換えるようにしてください:

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

    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 

    NSString *filePath = [docPath stringByAppendingPathComponent:[self.dirList objectAtIndex:indexPath.row ]]; 
    NSError *error = nil; 
    [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 

    [_dirList removeObjectAtIndex:indexPath.row]; 

    [self.data deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
} 

はそれが仕事を願っています!

関連する問題