tableView reloadData在文档目录

时间:2015-07-21 11:04:46

标签: ios objective-c uitableview reloaddata

我有一个问题,我似乎无法重新加载我的tableView中的数据。

我要做的是使用csv扩展名(我已经完成)将文件目录中的文件填充到tableView中,然后按下一个按钮,删除所有显示的文件并更新tableView。 按下按钮会删除文档目录中的文件,但不会使用更新的内容重新加载tableView。

  1. 我使用了断点来确认正在运行reloadData。
  2. 我在运行之前尝试使用removeAllObjects来清除我的数组 reloadData使用NSLog来确认数组是空的,不过这个 没有更新表格。
  3. 我在运行reloadData之前尝试将数组设置为nil,这也不起作用。
  4. 我尝试将数组中的数据设置为myArray = @ [];之前 运行reloadData,这会用空白数据覆盖数组但是 没有更新表格。
  5. 我尝试过不使用此方法 任何成功:

    dispatch_sync(dispatch_get_main_queue(), ^{
                    [self.tableView reloadData];
                });
    
  6. 我已经检查了我的代表的tableView,它们出现了 正确,(tableView中的所有其他功能包括 选择/取消选择多个项目并删除单个项目 每次使用tableView都会更新。
  7. 我也搜索了几个与我类似的不同问题,但仍未找到答案。
  8. 有人请检查下面的方法并告诉我为什么tableView没有正确重装?我确定我做错了什么,但我无法找到它。

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    
        return [filePathsArray count];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
        }
    
        _docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [_docPath objectAtIndex:0];
        _fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil];
        NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"];
        _csvFilesCell = [_fileList filteredArrayUsingPredicate:fltr];
        NSLog(@"Contents of directory: %@", _csvFilesCell);
        filePathsArray = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:documentsDirectory error:nil];
        cell.textLabel.text = [_csvFilesCell objectAtIndex:indexPath.row];
    
        return cell;
    }
    
    -(IBAction) deleteStoredData:(id)sender
    {
    
        NSLog(@"Delete data button pressed");
    
        UIAlertController*alert = [UIAlertController alertControllerWithTitle:@"Delete stored Data" message:@"Are you sure?" preferredStyle:UIAlertControllerStyleAlert];
    
        UIAlertAction* OK = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
            NSFileManager  *manager = [NSFileManager defaultManager];
    
            // the preferred way to get the apps documents directory
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
    
            // grab all the files in the documents dir
            NSArray *allFiles = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
    
            // filter the array for only csv files
            NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"];
            NSArray *csvFiles = [allFiles filteredArrayUsingPredicate:fltr];
    
            // use fast enumeration to iterate the array
            for (NSString *csvFile in csvFiles) {
    
                NSLog(@"PATH %@ : FILE %@", documentsDirectory, csvFile);
    
                NSError *error = nil;
    
                [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@", documentsDirectory, csvFile]
                                                           error:&error];
    
                NSLog(@"Error: %@", error);
                NSLog(@"OK button selected, all data deleted");
    
                [self updateDeleteButton];
    
                [self.tableView reloadData];
                [alert dismissViewControllerAnimated:YES completion:nil];
    
    
            }
        }];
    
        UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            NSLog(@"Cancel button selected, no data deleted");
            [alert dismissViewControllerAnimated:YES completion:nil];
        }];
        [alert addAction:OK];
        [alert addAction:cancel];
        [self presentViewController:alert animated:YES completion:nil];
    
    }
    

1 个答案:

答案 0 :(得分:0)

看到你的代码后,我提出了以下解决方案,希望它可以帮到你!!

_docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [_docPath objectAtIndex:0];
_fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.csv'"];
_csvFilesCell = [_fileList filteredArrayUsingPredicate:fltr];
NSLog(@"Contents of directory: %@", _csvFilesCell);
filePathsArray = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:documentsDirectory error:nil];

上面的代码应该在点击删除按钮时触发,而不是在tableview的数据源方法中触发。之后你应该重新加载你的tableview,你的 cellForRowAtIndexPath 方法应该是这样的:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
        }
        cell.textLabel.text = [_csvFilesCell objectAtIndex:indexPath.row];
        return cell;
    }