向NSTableView添加行不会更改其框架

时间:2013-05-01 06:34:47

标签: objective-c macos cocoa nstableview nsscrollview

我正在尝试在NSTableView的末尾插入一个新行,滚动到它并开始编辑它。除滚动外,一切似乎都能正常工作。表视图似乎滚动到紧接在最后一行之前的行(这是我刚刚添加的行)。

以下是我使用的代码:

- (void)insertNewRowInMainTable
{
    [self logScrollView];

    NSUInteger lastRow = self.mainTableView.numberOfRows;
    [self.mainTableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:lastRow] withAnimation:NSTableViewAnimationEffectFade];
    [self.mainTableView editColumn:0 row:lastRow withEvent:nil select:YES];

    NSLog(@"Inserted Row");
    NSLog(@"last row rect: %@",NSStringFromRect([self.mainTableView rectOfRow:lastRow]));
    [self logScrollView];
}

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
    NSInteger selectedRow = [self.mainTableView selectedRow];
    [self.mainTableView scrollRowToVisible:selectedRow];
}

- (void)logScrollView
{
    NSScrollView *scrollView = [self.mainTableView enclosingScrollView];
    NSLog(@"Document visible rect: %@",NSStringFromRect([scrollView documentVisibleRect]));
    NSLog(@"Table view frame: %@",NSStringFromRect([self.mainTableView frame]));

    NSInteger selectedRow = [self.mainTableView selectedRow];
    NSLog(@"Selected row rect: %@",NSStringFromRect([self.mainTableView rectOfRow:selectedRow]));
}

以下是日志的输出:

2013-05-01 16:22:04.254 DEGS[96570:303] Document visible rect: {{0, 0}, {509, 506}}
2013-05-01 16:22:04.255 DEGS[96570:303] Table view frame: {{0, -204}, {509, 1732}}
2013-05-01 16:22:04.256 DEGS[96570:303] Selected row rect: {{0, 0}, {509, 209}}
2013-05-01 16:22:04.287 DEGS[96570:303] Inserted Row
2013-05-01 16:22:04.287 DEGS[96570:303] last row rect: {{0, 1732}, {509, 161}}
2013-05-01 16:22:04.288 DEGS[96570:303] Document visible rect: {{0, 1226}, {509, 506}}
2013-05-01 16:22:04.288 DEGS[96570:303] Table view frame: {{0, -204}, {509, 1732}}
2013-05-01 16:22:04.288 DEGS[96570:303] Selected row rect: {{0, 1732}, {509, 161}}

我可以从日志中看到插入新行不会改变表视图​​的帧大小。因此,当我滚动到最后一行时,滚动视图滚动到contentView的底部,但是错误的大小仅显示第二行的第二行。

我可以通过在插入行后手动移动滚动视图来修复此问题,但我想了解它是否是错误或功能?

2 个答案:

答案 0 :(得分:1)

插入新行不会滚动表格视图。这是给定的功能。

您需要向下滚动才能看到最后添加的行。

此方法适用于您:

- (void)scrollRowToVisible:(NSInteger)row;

答案 1 :(得分:0)

遇到同样的问题,新添加的行不会滚动到,或者根据表滚动位置只显示顶部的一个或两个像素。我实施了manual scrolling,现在效果非常好。