【发布时间】:2020-10-26 16:20:11
【问题描述】:
我有一个 NSTableView,它的父级是 NSMenuItem 的视图。 NSTableView 是一个基于视图的表。我使用来自 NSArrayController 的数据绑定来填充表。
在 NSTableView 中滚动的性能非常糟糕。滚动功能似乎不是“连续的”,只有在我将手指从触控板上抬起时才会滚动。这种行为有点像当您有一个文本字段时,它只在按下返回键时发送其操作,而不是连续发送操作。
如果我打开和关闭菜单的次数足够多,表格将在 NSTableView 的一部分中平滑滚动,但很快就会恢复为生涩的滚动。我也可以单击并拖动以相对流畅地有效滚动行,但同样,两指滚动手势超级笨拙。
下面是如何填充表格的代码。在 IB 中,文本字段绑定到 name 属性,NSImageView 绑定到名为 AmphRunningApp 的自定义类的图标属性。
AmphRunningApp 类:
import Foundation
import Cocoa
class AmphRunningApp: NSObject
{
@objc var app: NSRunningApplication
@objc var name: String
@objc var icon: NSImage
init(app: NSRunningApplication, name: String, icon: NSImage)
{
self.name = name
self.app = app
self.icon = icon
}
填充表格:
@IBAction @objc func updateRunningAppsTable(sender: Any)
{
// Get all currently running apps
// and sort them alphabetically by localized name:
let runningApps = NSWorkspace.shared.runningApplications.sorted
{
$0.localizedName! < $1.localizedName!
}
// For every running app,
// add it to the array controller:
for app in runningApps
{
var duplicateApp = false
// Check that this app does not already exist in the array controller
for dupeApp in self.menuRunningAppAC.arrangedObjects as! [AnyObject]
{
if dupeApp.name == app.localizedName
{
duplicateApp = true
}
}
// If this app has not already been added
// to the array controller, add it
if duplicateApp == false
{
self.menuRunningAppAC.addObject(AmphRunningApp(app: app, name: app.localizedName!, icon: app.icon!))
}
}
self.statusMenuAppTable.reloadData()
}
【问题讨论】:
-
填充表格的代码是什么样的?
-
嗨@PhillipMills,感谢您的关注。我已将代码添加到问题中。非常感谢您的意见!
-
我还添加了另一个更新,试图更好地解释这种行为。似乎只有当我将手指从触控板上抬起时才会发生滚动,滚动应该是连续的,而不是等待我完成/停止滚动手势。
-
好的最后评论。我想我想通了,但根本原因仍然是个谜。请参阅下面关于 GCD 的回答。
标签: swift scroll nstableview