我有一个以编程方式创建/填充(基于视图)的 NSTableView,有 37 列和大约 119500 行。这表现得足够好 - 我可以将窗口设置为我喜欢的大小,并且仍然可以平滑地滚动。然而,当我向下滚动(比如一半)并进入全屏模式时,我的应用程序挂起(似乎永远)。内存使用量不断攀升,我已经看到它超过了 80GB。当我一直滚动到顶部时,我可以进入全屏模式,但是一旦进入全屏模式,向下滚动得越远,我遇到的延迟就越多,直到我的应用程序沙滩球。
我对仪器不是特别熟悉,但我做了一个时间分析器:
当“权重”从 82.5% 下降到 46.8% 并遵循另一条路径(权重为 35.7%,不在图中)时,我会找到另一个
[NSView _commonAwake]
,然后 [NSNotificationCenter addObserverForName: object:queue:usingBlock:]
。
不确定这是否重要,但我没有对 NSTableCellView 进行子类化,尽管它们的内容(标准 NSTextField)是可编辑的。当切换可编辑“关闭”时,我没有注意到行为上的差异。
这是怎么回事?为什么我的表格在不处于全屏模式(但接近相同尺寸)时工作正常,但在转换到全屏模式或处于全屏模式时不起作用?为什么当滚动到顶部时全屏可以工作,但我越往下滚动,速度就越慢,直到它挂起,而在非全屏时则不会这样做?
编辑1: 如果有帮助的话,我的
tableView(_:viewFor:row:)
功能如下:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let identifier = tableColumn!.identifier
let viewIdentifier: NSUserInterfaceItemIdentifier =
(identifier == .indexTableColumnItem) ? .indexTableColumnItem : .stringTableColumnItem
guard let cellView = tableView.makeView(withIdentifier: viewIdentifier, owner: self) as? NSTableCellView
else {
return nil
}
// force unwrap so they don't silently fail
let textField = cellView.textField!
textField.target = self
if identifier == .indexTableColumnItem {
textField.font = .monospacedSystemFont(ofSize: 12, weight: .regular)
textField.textColor = .secondaryLabelColor
textField.stringValue = String(row + 1)
}
else {
let column: Int = tableView.column(withIdentifier: identifier)
textField.stringValue = self.model[column: column - 1, row: row] ?? ""
textField.isEditable = true
textField.action = #selector(self.onTyping(_:))
}
return cellView
}
我尝试将其内容更改为简单的
return nil
,但这并没有提高全屏时的响应能力。
最终在我的窗口中设置“全尺寸内容视图”(通过故事板)