2017-07-18 82 views
0

使用Xcode 8,Swift 3和界面生成器与故事板以及仅包含按钮(播放)和滑块(音量)的非常基本的视图控制器。按下按钮时使用滑块swift

我试图在按下按钮的同时使用我的NSSlider。例如,我需要能够在缓慢降低音量的同时继续按“播放”。取而代之的是,一次只能使用一个按钮。所以,只要我使用返回键按下“播放”,我就无法调节音量,反之亦然。

在此示例中,播放按钮由“返回”键触发。

这是ViewController.swift中的代码。这只是我为快速研究问题而创建的一个示例应用程序。

NSSLider上是否存在Interface Builder设置,或者我可以在代码中执行某些操作来实现我正在尝试执行的操作?

import Cocoa 
import AVFoundation 

class ViewController: NSViewController { 

    var audioPlayer = AVAudioPlayer() 
    var sliderValue: Float = 0 

    @IBOutlet weak var volumeSliderOutlet: NSSlider! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     do{ 
      audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "bell ding", ofType: "wav")!)) 
     } 
     catch { 
      print(error) 
     } 
     audioPlayer.prepareToPlay() 


     // Do any additional setup after loading the view. 
    } 

    @IBAction func playButtonAction(_ sender: NSButton) { 
     if audioPlayer.isPlaying { 
      audioPlayer.currentTime = 0.0 
      audioPlayer.play() 
     } else { 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
     } 
    } 

    @IBAction func volumeSliderAction(_ sender: NSSlider) { 
     if audioPlayer.isPlaying { 
      sliderValue = self.volumeSliderOutlet.floatValue 
      audioPlayer.volume = sliderValue 
     } else { 
      return 
     } 
    } 

    override var representedObject: Any? { 
     didSet { 
     // Update the view, if already loaded. 
     } 
    } 


} 

我也试过这个,基于@ inspector_60的建议,但它也不起作用。在继续按下“返回”按钮的快捷键时仍然无法处理滑块。

override func keyDown(with event: NSEvent) { 
     if (event.keyCode == 36) { 
      self.playButtonAction(nil) 
     } 
     else { 
      return 
     } 
    } 

    func playButtonAction(_ sender: NSButton?) { 
     if audioPlayer.isPlaying { 
      audioPlayer.currentTime = 0.0 
      audioPlayer.play() 
     } else { 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } 
    } 
+0

你不能使用Play actio在VolumeSliderAction上合并? – ppinho

+0

我不确定你的意思。我需要能够同时或单独使用这两种操作。我想通过按住“返回”来反复播放声音,同时(用我的另一只手)用鼠标上下拖动滑块,从而改变音量。截至目前,我只能做一个或另一个。你能给我一个你的意思吗? – RickshawBoy

回答

0

IBAction是UI事件,因此不适合多个同时点击(您只有一个鼠标指针)。使用handling key events为了处理同时动作的键盘事件。

您还需要实现鼠标事件,这些环节应该有所帮助:

  1. 苹果有关鼠标事件的文件,特别是Filtering Out Key Events During Mouse-Tracking Operations
  2. 就如何落实这种做法
  3. This stack overflow answerpost,这将使你更多的信息和例子 - 罗恩的回答链接到一个与你无异的问题
+0

谢谢。我已经尝试调整代码,以便不使用构建在“Key Equivalent”中的IB,而只是使用keyDown调用函数来播放声音。我仍然面临同样的问题。只要我用鼠标控制滑块,我就不能用键触发播放功能。 – RickshawBoy

+0

我一直在尝试使用你的建议,但我似乎无法让它工作。我一直在浏览你共享的所有链接,并试图从Objective-C转换到Swift,但没有运气。这种事情发生在Python中(在我创建的同一个应用程序的另一个版本中)。你有什么机会给我一个Swift的例子吗?我只是希望能够在调整声音音量的同时继续击打我的关键字(返回)。 – RickshawBoy