Cocoa 使用NSTableView InsertRowsatindex

Cocoa 使用NSTableView InsertRowsatindex,cocoa,nstableview,Cocoa,Nstableview,我正在尝试使用动态方式将行添加到NSTableView NSTableView::InsertRowsatindex:带动画 为此,我更新保存数据源的NSArray的内容,然后 [myTableView beginUpdates]; NSRange theRange = NSMakeRange(0, [self.myTableContents count]-1); NSIndexSet* theIndexSet = [NSIndexSet indexSetWithIndexesInRange:t

我正在尝试使用动态方式将行添加到NSTableView NSTableView::InsertRowsatindex:带动画

为此,我更新保存数据源的NSArray的内容,然后

[myTableView beginUpdates];
NSRange theRange = NSMakeRange(0, [self.myTableContents count]-1);
NSIndexSet* theIndexSet = [NSIndexSet indexSetWithIndexesInRange:theRange];
[myTableView insertRowsAtIndexes:theIndexSet withAnimation:NSTableViewAnimationEffectFade];
[myTableView endUpdates];
我的问题是,当表格重新绘制时,我会得到一个边界错误,并计算每行的高度。我认为,文档中提到了这个问题:“表视图中的numberOfRows会自动增加索引的数量。”

如果我在myTableContents中有10个项目,并且我为所有10个项目调用InsertRowsatindex,则为第0-19行调用heightOfRow(myTableContents中的10行,加上调用InsertRowsatindex后添加的10行)


那么,其他表如何处理这个问题呢

范围应仅包括要插入的新行的范围。i、 e对于
insertRowsAtIndexes:
您应该传递要插入的新行的索引,而不是所有行


您的数据源也应该在那个时候更新,并且
numberOfRows
应该反映这一点。

范围应该只包括要插入的新行的范围。i、 e对于
insertRowsAtIndexes:
您应该传递要插入的新行的索引,而不是所有行


您的数据源也应该在那个时候更新,并且
numberOfRows
应该反映出这一点。

第一次重新加载表,然后使用这个

[myTableView beginUpdates];  
NSIndexSet* theIndexSet = [NSIndexSet indexSetWithIndex:[self.myTableContents count]-1];
[myTableView insertRowsAtIndexes:theIndexSet withAnimation:NSTableViewAnimationEffectFade];
[myTableView endUpdates];

第一次重新加载表,然后使用此

[myTableView beginUpdates];  
NSIndexSet* theIndexSet = [NSIndexSet indexSetWithIndex:[self.myTableContents count]-1];
[myTableView insertRowsAtIndexes:theIndexSet withAnimation:NSTableViewAnimationEffectFade];
[myTableView endUpdates];

谢谢在代码示例中,我在启动时填充表,因此我一次将模型中的所有项(myTableContents)添加到视图中。numberOfRows只报告数据源的大小,当我简单地调用reloadData时,这很好,但是当我使用insertRowsAtIndexes时,tableView将从numberOfRows获得的行数添加到NSIndexSet中的项目数,然后多次调用heightOfRow(每行一次)。因此,问题在于InserrowStatIndex增加的行数超出了数据源包含的行数。如何解决此问题?如果myTableContents表示完整的项,NSRange theRange=NSMakeRange(0,[self.myTableContents count]-1);正在反映到那么多行。假设模型中有10个对象。u在索引3,4处又插入了2个。范围应仅由3,4和numberOfRows组成:方法现在应返回12。假设numberOfRowsInTableView始终返回[myTableContents count]。要插入两个新行,我首先更新数据源(myTableContents),然后调用InsertRowsatindex来更新TableView。以您的示例为例,myTableView有10个项,我又添加了2个项,然后为这两个新项调用InsertRowsatindex,而不是调用reloadData。此时,NSTableView认为它有12项,而不是10项,因为调用InsertRowsatindex增加了它的内部行数。谢谢!在代码示例中,我在启动时填充表,因此我一次将模型中的所有项(myTableContents)添加到视图中。numberOfRows只报告数据源的大小,当我简单地调用reloadData时,这很好,但是当我使用insertRowsAtIndexes时,tableView将从numberOfRows获得的行数添加到NSIndexSet中的项目数,然后多次调用heightOfRow(每行一次)。因此,问题在于InserrowStatIndex增加的行数超出了数据源包含的行数。如何解决此问题?如果myTableContents表示完整的项,NSRange theRange=NSMakeRange(0,[self.myTableContents count]-1);正在反映到那么多行。假设模型中有10个对象。u在索引3,4处又插入了2个。范围应仅由3,4和numberOfRows组成:方法现在应返回12。假设numberOfRowsInTableView始终返回[myTableContents count]。要插入两个新行,我首先更新数据源(myTableContents),然后调用InsertRowsatindex来更新TableView。以您的示例为例,myTableView有10个项,我又添加了2个项,然后为这两个新项调用InsertRowsatindex,而不是调用reloadData。此时,NSTableView认为它有12项,而不是10项,因为它的内部行数是通过调用InsertRowsatindex而增加的。