2017-07-18 80 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