我有一个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!");
}
}
答案 0 :(得分:16)
您可以从表的-enclosingScrollView的-contentView中添加自己作为观察者(在NSNotificationCenter意义上,而不是KVO / Bindings意义上)NSViewBoundsDidChangeNotification,并根据可见矩形进行必要的反应。
<强>更新强>
在某处做这件事(也许是-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中。
答案 1 :(得分:0)
关于您的更新: 由于某些原因,我有 var currentPosition = CGRectGetMaxY([scrollView visibleRect]); 总是相同的值,我发现使用NSClipView边界更好:
NSClipView *clipView = ...;
NSRect newClipBounds = [clipView bounds];
CGFloat currentPosition = newClipBounds.origin.y + newClipBounds.size.height;