swift - 给定一个时间戳(字符串),如何在 NSTextView 中找到最接近的时间戳并滚动到它。确切的时间戳可能不存在

标签 swift xcode macos nstextview

我有一个 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 中找到最接近的时间戳并滚动到它?

最佳答案

一种方法是在时间戳上构建某种索引:

  1. 创建两个变量
    • var index: [String: [Range<String.Index>]]
    • var timestamps: [String]
  2. 当您获取文本时,对每个时间戳迭代一次:
    • 计算对应的范围
    • 添加条目到 index + 将其附加到 timestamps
  3. 当您查询时间戳时,请在 timestamps 中查找。 :
    • 如果存在则返回第一个范围
    • 如果没有,则对 timestamps 使用二分搜索获取最接近的一个并查询其范围 index

您可能希望将此索引作为后台任务来执行。

关于swift - 给定一个时间戳(字符串),如何在 NSTextView 中找到最接近的时间戳并滚动到它。确切的时间戳可能不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49989417/

相关文章:

string - 如何在 Swift 中使用索引设置字符串的字符

swift - TableView 单元格可选 - swift

ios - FCM 后台通知在 iOS 中不起作用

ios - 拒绝许可后的 Facebook 登录

iphone - 如何修复 Xcode Organizer 在 "Installing team provisioning profile"处挂起的问题?

xcode - Sin(int) 在 Xcode 调试器 (lldb) 中被破坏

swift :NSBezier

iOS 滑动抽屉

xcode - OS X 是否支持 3 倍缩放?

macos - OpenNI Mac OS X 10.8 Kinect 超时