2016-08-04 4 views
0

Я подклассифицировал NSSlider, который ведет себя по-другому, если нажать клавишу выбора. Чтобы сделать это, я переопределил функцию mouseDown. Кажется, это делает работу. Дело в том, что я заметил, что подключенный @IBAction в моем ViewController запускается только тогда, когда ключ опции не нажат (т. Е. Когда метод mouseDown передается супер). Что мне не хватает, чтобы позволить @IBAction выполнить?Подкласс NSControl, IBAction не вызывается в Swift

Большое спасибо Помимо вопроса, улучшение советы по коду приветствуются ... :-)

Джош

class ViewController: NSViewController { 

    @IBOutlet weak var theSlider: MySlider! 
    @IBAction func moveSlider(sender: NSSlider) { 
     print(sender.floatValue) //works only with optionKey unpressed 
    } 
} 

class MySlider: NSSlider { //Implemented in another source file 

    @IBInspectable var multiplier: Float = 0.5 
    private var modifierKeys = NSEventModifierFlags.AlternateKeyMask 
    private var optionKeyPressed = false 
    private var previousSliderPosition: Float = 0.0 

//MARK: Init with NSCoder 
    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     Swift.print("init Coder called") 

     self.continuous = true 
     NSEvent.addLocalMonitorForEventsMatchingMask(.FlagsChangedMask) { (theEvent) -> NSEvent? in 
      self.flagsChanged(theEvent) 
      return theEvent 
     } 
    } 

//MARK: Mouse tracking 
    override func mouseDown(theEvent: NSEvent) { 

     if optionKeyPressed { 

      var keepOn = true 
      previousSliderPosition = self.floatValue * Float(self.bounds.width)/Float(self.maxValue) 

      while keepOn { 
       if let nextEvent = self.window?.nextEventMatchingMask(Int(NSEventMask.LeftMouseUpMask.rawValue) | Int(NSEventMask.LeftMouseDraggedMask.rawValue)) 
       { 
        switch nextEvent.type 
        { 
        case .LeftMouseDragged: 
         let mouseInnerLocationX = Float(self.convertPoint(nextEvent.locationInWindow, fromView: self.superview).x) 
         let mouseDelta = mouseInnerLocationX - previousSliderPosition 
         let newSliderPosition = previousSliderPosition + (mouseDelta) * multiplier 

         self.floatValue = newSliderPosition * Float(self.maxValue)/Float(self.bounds.width) 
         break 

        case .LeftMouseUp: 
         keepOn = false 
         break 

        default: 
         break 
        } 
       } 
      } 
     } else { 
      super.mouseDown(theEvent) 
     } 
    } 

//MARK: Option key handling 
    override func flagsChanged(theEvent: NSEvent) { 
     if (theEvent.modifierFlags.rawValue & NSEventModifierFlags.DeviceIndependentModifierFlagsMask.rawValue) == NSEventModifierFlags.AlternateKeyMask.rawValue { 
      optionKeyPressed = true 
     } else { 
      optionKeyPressed = false 
     } 
    } 
} 

ответ

1

Если вы не вызывая super.mouseDown, вам необходимо отправить действие сам:

sendAction(action, to: target) 

sendAction(_:to:), action и target являются действующими членами NSControl.

+0

Это работает! self.sendAction (self.action, to: nil) Спасибо! – Joshua