NSTableView reloadData - 索引超出边界异常

时间:2014-02-19 15:24:52

标签: objective-c arrays cocoa nstableview reloaddata

请原谅我花时间,但我花了很多时间尝试了一切在脑海中我在网上找到的东西:/

问题是在向其数组添加1条记录后重新加载NSTableView。我的应用程序从扫描文件目录开始,将其名称和修改日期添加到NSDutaries的NSMuttableArray中。然后将此信息加载到NSTableView,一切正常。 但当我创建新文件并尝试重新加载NStableViev时,我得到了这个:

[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]

现在我想展示一些我想要做的代码。

所以这是我的表格如何获取数据

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
    NSLog(@"--------->%ld",(long)filesCount);
    return filesCount;
}

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
    NSDictionary *flag = FilesArray[row];
    NSString *identifier = [tableColumn identifier];

    if ([identifier isEqualToString:@"filename"]){
        NSTableCellView *cellview = [tableView makeViewWithIdentifier:@"filename" owner:self];
        [cellview.textField setStringValue:flag[@"name"]];
        return cellview;

    }else if ([identifier isEqualToString:@"filedate"]){
        NSTableCellView *cellview = [tableView makeViewWithIdentifier:@"filedate" owner:self];
        [cellview.textField setStringValue:flag[@"date"]];
        return cellview;
    }
    return nil;
}

以及我在创建新文件时如何尝试重新加载数据:

if([identifier isEqualToString:@"newFileModalDone"]){
        NSString *newFileName = [self fileNameModalDone];
//creating new file 
        [TxtFileObj WriteToFile:[newFileName stringByAppendingString:@".txt"] :nil];
//rescaning directory
        [TxtFileObj GetFilesList];
        FilesArray = [TxtFileObj GetFileArray];
//updating files count 
        filesCount = [FilesArray count];

        [FilesListTable reloadData];

}

我试图多次观看调试器,似乎异常来自

NSDictionary *flag = FilesArray[row];

所以我在制作新电影后想到了错误的阵列尺寸,但我多次检查过,一切都很好。

请帮助我找出我做错了什么,抱歉,如果问题很明显,我对Objective C和COCOA很新。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

所以在阅读了一些论坛之后我终于找到了我的错误:)

不确定它是否正确但现在它的工作正常,现在代码如下:

if([identifier isEqualToString:@"newFileModalDone"]){
        NSString *newFileName = [self fileNameModalDone];
        [FilesListTable beginUpdates];
        [TxtFileObj writeToFile:[newFileName stringByAppendingString:@".txt"] :nil];
        [TxtFileObj getFilesList];
        FilesArray = [TxtFileObj filesListArray];
        [FilesListTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[FilesArray count]-1]
                              withAnimation:NSTableViewAnimationSlideDown];

        [FilesListTable endUpdates];
        [FilesListTable reloadData];
    }

我基本上做的是添加了3种方法:

[FilesListTable beginUpdates];

[FilesListTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[FilesArray count]-1]
                                  withAnimation:NSTableViewAnimationSlideDown];

[FilesListTable endUpdates];