【发布时间】:2017-12-23 23:15:58
【问题描述】:
将 Xcode 8、Swift 3 和 Interface Builder 与 Storyboard 和一个非常基本的视图控制器结合使用,只有一个按钮(播放)和一个滑块(音量)。
我正在尝试在按下按钮的同时使用我的 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()
}
}
【问题讨论】:
-
你不能在 VolumeSliderAction 组合上使用 Play 动作吗?
-
我不确定你的意思。我需要能够同时或分别使用这两个动作。我想通过按“返回”来一遍又一遍地播放声音,同时(用我的另一只手)使用鼠标上下拖动滑块,从而改变音量。到目前为止,我只能做一个或另一个。你能举例说明你的意思吗?
标签: swift xcode macos interface-builder