2016-08-04 13 views
0

オプションキーが押されたかどうかに応じて動作が異なるNSSliderをサブクラス化しました。そのためには、mouseDown関数をオーバーライドしました。それは仕事をするようです。 問題は、私はViewController内の接続された@IBActionが、オプションキーが押されていないとき(つまり、mouseDownメソッドがsuperに渡されたとき)にのみトリガーされることに気づいた。 @IBActionの実行を許可するために何が欠けていますか?NSControlのサブクラス化、SwiftでIBActionが呼び出されない

多くのおかげで 問題のほかに、コードの改善のアドバイスは歓迎されている... :-)

ジョシュ

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:)actiontargetは、の既存のメンバーであります。

+0

self.sendAction(self.action、to:nil)ありがとう! – Joshua

関連する問題