在自定义单元中显示进度指示器的Swift macOS应用程序中,是否可以同步所有指示器的旋转?

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

我有一个用Swift / Objective-C编写的Cocoa应用程序,我有一个问题,只是一个细节,但我认为这很重要。我有一个基于视图的NSOutlineView,它由一个数据源和一个委托驱动,并且我创建了一个仅包含旋转进度指示器的自定义NSTableViewCell。问题是,当应用程序窗口打开时,只有可见的旋转指示器会同步旋转。如果放大窗口并显示更多NSOutlineView单元,则新出现的旋转指示器将不会同步旋转。这在逻辑上是正确的,因为我在NSOutlineView委托方法中实例化了单元格:

outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView?

我的代码如下:

let view = outlineView.makeView(withIdentifier:NSUserInterfaceItemIdentifier.init("activityProgressTableViewCell"), owner: self) as! ProgressIndicatorTableCellView

view.unFinishedStatusIndicator.startAnimation(self)

因此,我认为指标不同步是正常的,因为它们在不同的时刻开始旋转。有人可以提出解决此问题的模式吗?任何帮助是极大的赞赏。谢谢。

P.S。我知道我可以使用Cocoa Bindings代替在指标上调用startAnimation,这可以让我立即启动所有指标的动画,但是如何处理NSOutlineView中子项目中的指标呢?

swift cocoa nsoutlineview
1个回答
0
投票

好吧,我已经发现了可能的解决方案,实际上是使用了可可绑定。在我的主控制器类中,我声明了这样的属性:

@objc dynamic var shouldStartFoldersIndicators: Bool = true

然后,在界面构建器中,我将进度指示器中的动画绑定绑定到主控制器的路径。然后,在此委托方法中:

outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView?

当我需要显示旋转指示器单元格时,我将Bool属性设置为false,然后设置为true。不幸的是,这不起作用:

self.shouldStartFoldersIndicators = false
self.shouldStartFoldersIndicators = true

为了使其工作,我不得不将语句推迟到下一个正在运行的循环,如下所示:

DispatchQueue.main.async {
   self.shouldStartFoldersIndicators = false
   DispatchQueue.main.async {
        self.shouldStartFoldersIndicators = true
   }
}

这很好,尽管我担心它会减慢NSOutlineView的重绘速度。预先感谢您提供更好的解决方案。谢谢

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