" ***由于未捕获的异常终止应用程序' NSRangeException',原因:' *** - [__ NSArrayM objectAtIndex:]:索引1超出边界[0 .. 0]&# 39;"

时间:2015-03-24 13:18:59

标签: ios objective-c xcode uitableview nsdocumentdirectory

我知道这是关于Stack Overflow的一个常见问题,但不幸的是没有人能够引导我找到我的解决方案。

我试图在UITableView中列出文档目录中的文件。 (我还有另一个查看我连接的设备的桌面视图)

我知道我收到此错误是因为它说我的数组有0个对象,并且我试图访问索引1处的对象。

但我的文档目录中有一个文件。 如果我有2个文件,当我删除1时,我收到此错误。当应用程序重新启动时,它会正确显示UITableView文件已删除。

我从这里得到了我的代码: 的 Objective-C: How to list files from documents directory into a UITableView?

这是我的内容:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (tableView == _tblConnectedDevices){
    return [_arrConnectedDevices count];
    }
    if ([filePathsArray count] > 0){
        return [filePathsArray count];
    }
    else 
    return 1;
}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (tableView == _tblConnectedDevices){
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"];
    }

    cell.textLabel.text = [_arrConnectedDevices objectAtIndex:indexPath.row];

    return cell;
    } else {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
        NSString *last = [documentsDirectory stringByAppendingPathComponent:[filePathsArray objectAtIndex:indexPath.row]];
        NSString *last2 = [[last lastPathComponent] stringByDeletingPathExtension];
        cell.textLabel.text = last2;
        return cell;
    }
}

我的删除无效:

-(IBAction)deleteFile:(id)sender{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,
                                                         YES);
    NSString *fullPath = [[paths lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.txt", fileName]];
    NSError *error;
        [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error];
    [_cellView reloadData];
}

2 个答案:

答案 0 :(得分:1)

在deleteFile中重新加载你的filePathArray:同时设置断点并查看你在数组中有多少文件

答案 1 :(得分:0)

你应该重构你的代码。但是:

我假设您在此行中收到错误:

NSString *last = [documentsDirectory stringByAppendingPathComponent:[filePathsArray objectAtIndex:indexPath.row]];

出了什么问题:

一个。你有一个内存路径的数组。当表视图询问您的项目数时,您将返回该数组的计数。

B中。当表视图请求连续的项目时,您将读取该目录。 (嗯,方法不应该那么快。)

filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];

然后查找索引为indexPath.row的文件:

NSString *last = [documentsDirectory stringByAppendingPathComponent:[filePathsArray objectAtIndex:indexPath.row]];

这"工作" (它类似于工作)只要你在目录中至少有数组中的文件。

从目录中删除文件时,它仍然是数组中的项目。所以你对表视图说,数组中的项数与行数一样多。当表视图尝试获取它时,您查看磁盘并找到较少的文件(丢失已删除的文件)。因此,从磁盘获取的数组比内存中的项少一个项。

要修复它:更新内存中的数组。或者做出决定:在内存中在磁盘上工作。

相关问题