如何以编程方式调用NSScrollView的自动滚动方法

16

我有一个简单的聊天应用程序,其中包含基于视图的NSTableView文本消息视图,如下图所示。 enter image description here 每个消息都包含一个NSTextView实例,其高度适合所有文本。

我需要做的就是在用户选择文本并拖动鼠标足够远时启动NSScrollView(其中包含NSTableView实例)自动滚动。不幸的是,自动滚动没有出现。 如果在文本视图之外拖动某处,则一切正常。

我尝试直接通过从NSTextView子类的“鼠标拖动”事件中推入NSEvent实例(例如此文章中的示例)来直接调用autoscroll:方法:

- (void)mouseDragged:(NSEvent *)event
{
  [self.scrollView autoscroll:event];
}

由于我覆盖了所有鼠标事件并实现了所有文本选择,因此这种方法经常被调用。但是自动滚动似乎不起作用。

更新

我发现在调用 -autoscroll: 方法之前,必须先调用同一对象的 -mouseDown: 方法。但是这会破坏我的文本选择机制。重点不在于成为第一响应者,而在于除了 mouseDown: 方法之外什么都没有。


如果你说的是在NSScrollView中有一个NSTableView,而NSTableView的行是多行的,当在单元格内选择文本并向下拖动超过滚动视图的底部时,它不会滚动?如果是这样,这个功能由NSScrollView自动提供,不需要其他任何东西来实现滚动。为了测试,我创建了一个新项目,添加了一个NSScrollView(NSTableView),将行高设置得比滚动视图大,并填充了表格视图。点击文本,然后向下选择超过滚动视图的底部,它会自动滚动。 - Jay
@Jay,我需要开始NSTableView滚动视图的自动滚动,而不是文本视图的自动滚动(文本视图的高度足以适应文本)。 - Daniyar
我不确定你在问什么。假设你从Xcode的对象库中将NSTableView拖到窗口上,那么NSTableView将被NSScrollview包围。如果你试图通过在文本所在的行单击鼠标并向下拖动来选择表格视图中的行文本(从屏幕截图中看起来是这样),则封装NScrollView会自动处理并向上滚动,以便你可以继续选择文本。 - Jay
@Jay 当我选择文本时,它会启动 NSTextView 的 scrollView 自动滚动。但我想要自动滚动 tableView 的滚动视图。 - Daniyar
我认为它应该自动滚动。在我创建的测试项目中,tableView 高度为 100,我将行高设置为 200,将 cellView 高度设置为 200,并填充每一行足够的文本以使其超过 tableview 的高度。当我选择一行中的文本并向下拖动时,整个表格都会滚动。 - Jay
但是,由于我在NSTextView子类中覆盖了所有鼠标事件以实现通过表格视图进行顺序文本视图选择,因此它不会自动滚动。 - Daniyar
1个回答

2
通常情况下,文本视图都在其自己的滚动视图中。即使这个滚动视图足够大以显示所有文本而无需滚动,它仍然存在。在该滚动视图内(可能包括该滚动视图本身),对任何内容调用-autoscroll:将尝试滚动该滚动视图,而不是包含表格视图的滚动视图。
尝试在层次结构中更高的视图上调用-autoscroll:。可以是self.scrollView.superview、表格单元格视图或表格视图。
但要注意,即使文本视图所在的单元格视图完全显示在屏幕上,表格视图的滚动视图仍将继续滚动。实际上,它可能会滚动得太远,以至于在另一个方向上超出了屏幕。基本上,它不知道您正在尝试在文本视图中进行选择,因此当选择扩展到文本视图的边缘时,它不知道应该停止。
另一种方法是尝试使用“裸”文本视图,没有包含的滚动视图。我认为IB不会让你这样做,所以你必须通过编程来完成。然而,裸的文本视图与自动布局不兼容。

调用-autoscroll:(在表视图或其包含的滚动视图上)使用从-mouseDragged:参数获取的事件不起作用。也许我应该以某种方式改变NSEvent - Daniyar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接