Пользовательские классы NSControl в OS X 10.10

Мне нужно разработать новый пользовательский NSControl. Все руководства и примеры, которые я могу найти (в том числе статья подкласса Apple NSControl) построены вокруг NSCell. Но по состоянию на 10.10 все сообщения, связанные с ячейкой в ​​NSControl, устарели.

Я попробовал просто создать подкласс и добавить в свой проект через пользовательский вид в IB, но я не могу заставить элемент управления принимать первого ответчика, несмотря на то, что он включен, и устанавливает refusesFirstResponder равным NO и возвращает YES из acceptsFirstResponder. И я уверен, что мне не хватает функциональности (уведомления об изменении стоимости и т.д.), Которые должны быть там.

Существует ли более новая ссылка, которая показывает, как теперь должны быть разработаны средства управления? Мой Google-фу меня подведет, если есть. Спасибо!

Ответ 1

Вероятно, ваша проблема заключалась в том, что вы никогда не устанавливали контроль в качестве первого ответчика. Просто щелчок по нему не будет делать это автоматически. Ниже приведен краткий пример, который принимает статус первого ответчика (и становится таким же нажатием), и рисует кольцо фокусировки. Обязательно включите управление и установите его цель и действие.

class MyControl: NSControl {


    override var acceptsFirstResponder: Bool {
        return true
    }


    override func becomeFirstResponder() -> Bool {
        return true
    }


    override func mouseDown(with event: NSEvent) {
        window?.makeFirstResponder(self)
    }

    override func mouseUp(with event: NSEvent) {
        if let action = action {
            NSApp.sendAction(action, to: target, from: self)
        }
    }


    override func draw(_ dirtyRect: NSRect) {
        NSColor.white.set()
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()

        if window?.firstResponder == self {
            NSColor.keyboardFocusIndicatorColor.set()
        } else {
            NSColor.black.set()
        }
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke()
    }


    override var focusRingMaskBounds: NSRect {
        return bounds.insetBy(dx: 1, dy: 1)
    }


    override func drawFocusRingMask() {
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()
    }

}