我有一个 NSTextView 显示日志(15+ mb 的文本)。日志中会有时间戳。示例片段:
2018-04-22 07:54:49 <Homebound> [tests > ... Ending
2018-04-22 07:54:49 <Homebound> [tests > ... Starting
launchctl load /System/Library/
2018-04-22 07:54:50 (null)
我有一个带有时间戳的下拉菜单。时间戳是具有以下格式的字符串:
2018-04-22 07:54:49
目前,我可以从下拉菜单中选择时间戳,并在 NSTextView 中找到时间戳并滚动到时间戳所在的位置。这是代码:
let haystack = myTextBox.string
var needle = failuresArray[selectedIndex - 1][3]
needle.removeLast(2)
// (needle would like like: 2018-04-22 07:54)
if let needleRange = haystack.range(of: needle) {
myTextBox.scrollRangeToVisible(NSRange(needleRange, in: haystack))
}
我遇到的问题是,确切的时间戳可能不在 NSTextView 中显示的日志中。如何在 NSTextView 中找到最接近的时间戳并滚动到它?
最佳答案
一种方法是在时间戳上构建某种索引:
- 创建两个变量
-
var index: [String: [Range<String.Index>]]
-
var timestamps: [String]
-
- 当您获取文本时,对每个时间戳迭代一次:
- 计算对应的范围
- 添加条目到
index
+ 将其附加到timestamps
- 当您查询时间戳时,请在
timestamps
中查找。 :- 如果存在则返回第一个范围
- 如果没有,则对
timestamps
使用二分搜索获取最接近的一个并查询其范围index
您可能希望将此索引作为后台任务来执行。
关于swift - 给定一个时间戳(字符串),如何在 NSTextView 中找到最接近的时间戳并滚动到它。确切的时间戳可能不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49989417/