2014-12-05 5 views
10

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

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

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

+0

Вы когда-нибудь это выясняли? Я пытаюсь разобраться с тем же. Благодарю. – pizzafilms

+0

Нет, никогда не было - я отложил его, чтобы работать над чем-то еще, и еще не вернулся к нему. – starkos

+0

Не могли бы вы показать код? – rocky

ответ

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() 
    } 

} 
+0

Мой вопрос относительно современной ссылки для подкласса NSControl все еще стоит; если Apple выпустит обновленную статью, я еще не наткнулся на нее. Что касается первого ответчика: я оставил этот код и принял другой подход, и мне было слишком давно, чтобы я вспомнил. – starkos

+0

Если вы исключаете NSCell, элементы управления зданием намного проще *. Элементы управления на самом деле не отличаются от любого другого представления, которое обрабатывает события ввода пользователя. Единственное, что в прошлом разделяло их, было использование NSCell в качестве основного механизма для событий и отображения, чтобы они работали в виде таблиц и т. Д. Теперь, когда NSCell мертв, это просто - просто используйте то, что доступно в NSView/NSResponder/NSControl API. Я не уверен, что действительно предложит новый гид. – seth

Смежные вопросы