6

我有一个 NSTableView,我想知道用户何时滚动到底部,以便执行操作。不太清楚该怎么做?

更新:这是我计算表格底部的方法:

-(void)tableViewDidScroll:(CPNotification) notification
{
    var scrollView = [notification object];
    var currentPosition = CGRectGetMaxY([scrollView visibleRect]);
    var tableViewHeight = [messagesTableView bounds].size.height - 100;

    //console.log("TableView Height: " + tableViewHeight);
    //console.log("Current Position: " + currentPosition);

    if (currentPosition > tableViewHeight - 100)
    {
       console.log("we're at the bottom!");
    }
}
4

2 回答 2

16

您可以从表的 -enclosureScrollView 的 -contentView 将自己添加为 NSViewBoundsDidChangeNotification 的观察者(在 NSNotificationCenter 意义上,而不是 KVO/Bindings 意义上),并根据可见矩形做出必要的反应。

更新

在某处执行此操作(可能是 -awakeFromNib):

// Configure the scroll view to send frame change notifications
id clipView = [[tableView enclosingScrollView] contentView];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(myBoundsChangeNotificationHandler:)
                                             name:NSViewBoundsDidChangeNotification
                                           object:clipView];

把它放在有用的地方:

- (void)myBoundsChangeNotificationHandler:(NSNotification *)aNotification
{

if ([aNotification object] == [[tableView enclosingScrollView] contentView])
    [self doSomethingInterestingIfDocumentVisibleRectSatisfiesMe];

}

本质上,您想检查滚动视图-documentVisibleRect以查看底部的几个像素是否可见。请记住考虑在Views Programming Guide中介绍的具有翻转坐标系的视图的可能性 - “翻转视图” 。

于 2011-02-10T16:52:23.047 回答
0

关于您的更新:由于某些原因,我有 var currentPosition = CGRectGetMaxY([scrollView visibleRect]); 总是相同的值,我发现使用 NSClipView 边界更好:

NSClipView *clipView = ...;
NSRect newClipBounds = [clipView bounds];
CGFloat currentPosition = newClipBounds.origin.y + newClipBounds.size.height;
于 2016-08-17T10:19:56.553 回答