按下按钮swift时使用滑块

时间:2017-07-18 21:54:45

标签: swift xcode macos interface-builder

使用Xcode 8,Swift 3和Interface Builder与Storyboard和一个非常基本的视图控制器,只有一个按钮(播放)和一个滑块(音量)。

我试图在同时按下按钮的同时使用我的NSSlider。例如,我需要能够继续按下" Play"同时慢慢降低音量。相反的是,一次只能使用一个按钮。所以,只要我按下" Play"使用返回键,我无法调整音量,反之亦然。

在此示例中,播放按钮由" return"触发。键。

以下是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()
        }
    }

1 个答案:

答案 0 :(得分:0)

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

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

  1. 关于鼠标事件的Apple文档,特别是Filtering Out Key Events During Mouse-Tracking Operations
  2. 关于如何实施此方法的
  3. This stack overflow answer
  4. 这个post将为您提供更多信息和示例--Ron的答案链接到与您的问题没有区别的问题