我正在使用NSColorPanel更改视图的颜色。此视图的颜色也保存在数据库中(Firestore)。
import AppKit
class ColorPanel {
static var shared = ColorPanel()
private var stage: DB.Stage.Document? = nil
private let cp = NSColorPanel.shared
init() {
cp.setTarget(self)
cp.setAction(#selector(colorDidChange(sender:)))
cp.isContinuous = false
}
func show(stage: DB.Stage.Document) {
self.stage = stage
cp.makeKeyAndOrderFront(nil)
}
@objc func colorDidChange(sender: NSColorPanel) {
guard let stage = stage else { return }
stage.data?.color.red = Double(sender.color.redComponent)
stage.data?.color.green = Double(sender.color.greenComponent)
stage.data?.color.blue = Double(sender.color.blueComponent)
stage.update()
}
}问题是,我希望将isContinuos设置为true,以便看到我的视图实时更改颜色,但向服务器发送了太多更新,因此我被迫将其设置为false。
有办法解决这个问题吗?我只需要做一个更新,当我完成拖拽,但我不知道如何做。
附注:为了在我的SwiftUI视图中调用ColorPanel,我这样做:
ColorPanel.shared.show(stage: stage)发布于 2020-01-10 01:08:03
请尝试我将使用的方法。免责声明:由于缺少Firestore安装程序而未测试
import Combine
class ColorPanel {
static var shared = ColorPanel()
private var stage: DB.Stage.Document? = nil
private let cp = NSColorPanel.shared
private var subscriber: AnyCancellable?
private let publisher =
PassthroughSubject<NSColor, Never>()
.throttle(for: 10, scheduler: RunLoop.main, latest: true)
init() {
cp.setTarget(self)
cp.setAction(#selector(colorDidChange(sender:)))
cp.isContinuous = true
}
func show(stage: DB.Stage.Document) {
self.stage = stage
self.subscriber = nil
if stage != nil {
self.subscriber = self.publisher
.sink { _ in
self.stage.update() // << be called once per 10 seconds
}
}
cp.makeKeyAndOrderFront(nil)
}
@objc func colorDidChange(sender: NSColorPanel) {
guard let stage = stage else { return }
stage.data?.color.red = Double(sender.color.redComponent)
stage.data?.color.green = Double(sender.color.greenComponent)
stage.data?.color.blue = Double(sender.color.blueComponent)
self.publisher.upstream.send(sender.color)
}
}https://stackoverflow.com/questions/59667482
复制相似问题