【问题标题】:Adding row to NSTableView doesn't change its frame向 NSTableView 添加行不会改变它的框架
【发布时间】:2013-05-01 06:34:47
【问题描述】:

我正在尝试在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 的底部,但错误的大小只显示倒数第二行。

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

【问题讨论】:

    标签: objective-c macos cocoa nstableview nsscrollview


    【解决方案1】:

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

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

    这个方法可以为你做到这一点:

    - (void)scrollRowToVisible:(NSInteger)row;
    

    【讨论】:

    • 是的,但在我的代码中,我调用表格视图的-editColumn:row:withEvent:select: 方法,选择是。然后调用-tableViewSelectionDidChange: 委托方法,该方法滚动到选定的单元格。正如我所说,当我插入一个新单元格时会发生滚动,但它会滚动到错误的位置。它滚动到倒数第二个单元格而不是最后一个。
    • selDidChange 不会滚动到最后一行。
    • 是的,但是如果您查看我上面的代码,您会发现我将 -scrollRowToVisible: 调用到 selDidChange 中的选定行
    • 在添加新行后尝试使用NSInteger selectedRow = [self.mainTableView selectedRow]; [self.mainTableView scrollRowToVisible:selectedRow];
    • 还是没有运气!正如我所说,问题似乎是我插入新行后表格视图没有调整其框架的高度,因此当滚动发生时,滚动视图计算错误的位置。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多