Обнаружение измененного выделения NSColorWell

Я искал, как использовать NSColorWell в моем приложении, но, кажется, не так много документации по нему.

Есть ли способ вставить палитру цветов (например, NSColorWell/NSColorPanel) прямо на мой взгляд? При нажатии на лунку всегда отображается новое окно выбора цвета. Разве это не может быть как-то встроено?

У меня есть обычай NSButton класс, которому я передаю цвет от моего NSColorWell, Чтобы сделать это, мне нужно заставить пользователя выбрать цвет, а затем нажать кнопку, чтобы отправить этот цвет в мой пользовательский класс. Есть ли способ просто определить, когда новый цвет выбран прямо из палитры цветов?

3 ответа

Решение

Для проблемы 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"]

Есть способ сделать это и с привязками, но с этими двумя все в порядке.

Для 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)")
        } 
    }

Для проблемы с цветной панелью я тоже искал такую ​​вещь. Закрытия, которые я мог найти, были на CocoaControls. К сожалению, это работает только на 10.7+ (поскольку он использует NSPopover), и похоже, что он использует частный API.

Другие вопросы по тегам