检测NSColorWell的更改选择

时间:2011-07-20 12:41:54

标签: objective-c macos cocoa nscolorwell

我一直在研究如何在我的应用中使用NSColorWell,但似乎没有太多文档。

有没有办法将颜色选择器(例如NSColorWell / NSColorPanel)直接嵌入到我的视图中?单击井时,它始终显示一个新的颜色选择窗口。这不能以某种方式嵌入吗?

我有一个自定义的NSButton课程,我从NSColorWell传递颜色。要做到这一点,我必须让用户选择一种颜色,然后单击一个按钮将此颜色发送到我的自定义类。有没有办法简单地检测何时直接从颜色选择器中选择新颜色?

3 个答案:

答案 0 :(得分:6)

对于问题1,不,这是NSColorWell的系统行为。不喜欢吗?做你自己的。

问题2有两种可能的解决方案。

方法1:将颜色井中的动作连接到IB中的对象,并通过班级的插座读取颜色的颜色。井中的任何颜色变化都会向您选择的选择器发送消息。

方法2:将您自己的对象作为观察者添加到color属性

[colorwell addObserver:self forKeyPath:@"color" options:0 context:NULL];

然后实施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

任何颜色变化都会触发该方法。

请务必在dealloc或另一种分解方法中脱色;

[colorwell removeObserver:self forKeyPath:@"color"]

还有一种方法可以使用绑定,但这两种方法都很好。

答案 1 :(得分:1)

对于swift 2,我使用此代码:

@IBOutlet weak var colorSelector: NSColorWell!

    override func viewDidAppear() {
        super.viewDidAppear()

        self.colorSelector.addObserver(self, forKeyPath: "color", options: .New, context: nil)

    }

    override func viewDidDisappear(){
        super.viewDidDisappear()

        self.colorSelector.removeObserver(self, forKeyPath:"color")
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        print("keyPath=>\(keyPath)")

        if (keyPath! == "color") {
            print("object=>\(self.colorSelector.color)")
        } 
    }

答案 2 :(得分:0)

对于彩色面板问题,我也在寻找这样的东西。我能找到的关闭是CocoaControls上的这个关闭。不幸的是,这仅适用于10.7+(因为它使用NSPopover),看起来它使用私有API。