gpt4 book ai didi

cocoa - 保持 NSScrollView 固定

转载 作者:行者123 更新时间:2023-12-03 17:23:52 32 4
gpt4 key购买 nike

我在 NSScrollView 中有一个 NSTableView。 NSTableView 的内容是通过绑定(bind)到 NSArrayController 来提供的,而 NSArrayController 又绑定(bind)到 CoreData ManagedObjectContext。 NSTableView 的新行只是添加到,而不会被删除或重新排序。

我想将 NSTableView (或 NSScrollView)固定在底部,以便添加到表中的新行立即可见。此外,当 NSTableView 滚动到底部时,而不是当用户向上滚动以查看其他行时,才会发生这种情况。

我当前正在使用以下代码

- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
NSInteger numberOfRows = [tableView numberOfRows];
NSLog(@"row: %lu, %lu numberOfRows ", row, numberOfRows);
if (row == numberOfRows-1) {
[tableView scrollRowToVisible:numberOfRows - 1];
}
}

到目前为止,这是有效的,但只是在窗口处于事件状态时有效。当窗口处于非事件状态时,直到窗口再次变为事件状态时,才会调用 didAddRowView 方法。因此 NSTableView 不会立即向下滚动。由于 NSTableView 也通过 CoreData 绑定(bind)填充,我不知道插入新项目后我可以在哪里手动触发滚动。此外,didAddRowView 委托(delegate)方法经常被调用(例如,手动滚动表格时),并且只有在插入新项目后才真正需要向下滚动,这使得解决方案更加不优雅。

当应用程序处于事件状态和非事件状态(仅当新行添加到 NSTableView 时),我是否可以直接 Hook 到插入过程或 NSScrollView 来向下滚动到底部?

编辑:为了完成或者如果 @rdelmar 的解决方案不适合您,我对有问题的 NSTableView 进行了子类化并在 reloadData 方法中实现了它

- (void) reloadData {
[super reloadData];
NSInteger numberOfRows = [self numberOfRows];
NSRange rowsInRect = [self rowsInRect:self.superview.bounds];
NSInteger lastVisibleRow = rowsInRect.location + rowsInRect.length;

if (lastVisibleRow == numberOfRows-1) {
[self scrollRowToVisible:numberOfRows - 1];
}
}

一旦 ArrayController 接收到新项目,就会调用 reloadData 方法并将其添加到表中。调用父类(super class)的 reloadData 后,这会检查 TableView 是否滚动到底部(TableView 的最后一行是超 View 中可见的最后一行 - 因此是周围的 NSScrollView)。如果是这样,它会向下滚动。如果不是,用户可能会向上滚动以查看表格的某些内容,并且不希望它自动向下滚动。

最佳答案

我认为您应该能够使用 NSManagedObjectContext 通知 NSManagedObjectContextObjectsDidChangeNotification。创建一个自定义 NSTableView 类并为该通知添加一个观察者:

@实现自定义表

-(void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollTable:) name:NSManagedObjectContextObjectsDidChangeNotification object:nil];
}

-(void)scrollTable:(NSNotification *) aNote {
if ([[aNote.userInfo allKeys] containsObject:@"inserted"]) {
[self scrollRowToVisible:self.numberOfRows -1];
}else{
NSLog(@"It was not an insertion");
}
}

关于cocoa - 保持 NSScrollView 固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12295849/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com