NSTableView 在全屏模式下向下滚动时挂起

问题描述 投票:0回答:1

我有一个以编程方式创建/填充(基于视图)的 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
,但这并没有提高全屏时的响应能力。

swift nstableview appkit
1个回答
0
投票

最终在我的窗口中设置“全尺寸内容视图”(通过故事板)

© www.soinside.com 2019 - 2024. All rights reserved.