NSTableView reloadData - 索引超出范围异常

Posted

技术标签:

【中文标题】NSTableView reloadData - 索引超出范围异常【英文标题】:NSTableView reloadData - index beyond bounds exception 【发布时间】:2014-02-19 15:24:52 【问题描述】:

请原谅我耽误了您的时间,但我花了很多时间尝试了所有我想到的以及我在互联网上找到的一切:/

问题是在将 1 条记录添加到其数组后重新加载 NSTableView。我的应用程序首先扫描文件目录,将它们的名称和修改日期添加到 NSDictionaries 的 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 很陌生。

感谢您的帮助!

【问题讨论】:

我不明白你的代码。 [TxtFileObj GetFilesList]; 是类方法吗?这看起来根本不对。 另外请发布您的实际代码。 return cell view; 不会编译。 @***foe 看一下我的问题,[TxtFileObj GetFilesList]; 是一个实例方法。这是我的实际代码,可以正常编译。 @DigiMonk ty,先生!我会记住的。 你的代码看起来不错(除了非法的return cell view 和奇怪的大写)。除了在您的 tableview 代表中记录 row 的使用并在 numberOfRowsInTableView: 中返回 [FilesArray count] (不需要 filesCount)之外,不确定还有什么建议。 【参考方案1】:

所以在阅读了一些论坛后,我终于发现了我的错误:)

不确定它是否正确,但现在可以正常工作,现在代码如下所示:

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];

【讨论】:

以上是关于NSTableView reloadData - 索引超出范围异常的主要内容,如果未能解决你的问题,请参考以下文章

NSTableView reloadData 内存泄漏

NSTableView reloadData - 索引超出范围异常

拖出 NSTableView 以移除

NSTableView:创建“重叠”行

NSTableView 意外调整大小

NSTableView 委托不工作/不填充单元格