Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 按下按钮时使用滑块_Swift_Xcode_Macos_Interface Builder - Fatal编程技术网

Swift 按下按钮时使用滑块

Swift 按下按钮时使用滑块,swift,xcode,macos,interface-builder,Swift,Xcode,Macos,Interface Builder,使用Xcode 8、Swift 3和Interface Builder以及故事板和一个非常基本的视图控制器,该控制器只有一个按钮(播放)和一个滑块(音量) 我试图在按下按钮的同时使用NSSlider。例如,我需要能够在缓慢降低音量的同时继续按“播放”。相反,一次只能使用一个按钮。因此,只要我使用返回键按下“播放”,我就无法调整音量,反之亦然 在本例中,播放按钮由“返回”键触发 以下是ViewController.swift中的代码。这只是我为研究这个问题而快速创建的一个示例应用程序 NSSLid

使用Xcode 8、Swift 3和Interface Builder以及故事板和一个非常基本的视图控制器,该控制器只有一个按钮(播放)和一个滑块(音量)

我试图在按下按钮的同时使用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的建议,我也尝试过这个方法,但它也不起作用。继续按“返回”按钮的快捷键时,仍然无法处理滑块


iAction是UI事件,因此不适合同时进行多次单击(您只有一个鼠标指针)。用于处理键盘事件以同时执行操作

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

  • 关于鼠标事件的Apple文档,特别是
  • 关于如何实施这一方法
  • 这将为您提供更多信息和示例-Ron的答案链接到一个与您的问题没有太大区别的问题

  • 你不能用体积和牵引力的结合来表演动作吗?我不知道你的意思。我需要能够同时或分别使用这两个动作。我想通过按下“回车键”一遍又一遍地播放声音,同时(用另一只手)使用鼠标上下拖动滑块,从而改变音量。到目前为止,我只能做其中之一。你能给我举个例子说明你的意思吗?谢谢。我试着调整代码,这样我就不用IB内置的“等效键”,而是用keyDown调用一个函数来播放声音。我还是会遇到同样的问题。只要我用鼠标控制滑块,我就不能用键触发播放功能。我一直在尝试使用你的建议,但我似乎无法让它工作。我一直在看你分享的所有链接,并试图从Objective-C翻译成Swift,但运气不好。这类事情只发生在Python中(在我创建的同一个应用程序的另一个版本中)。你能给我举个快速的例子吗?我只想在调整音量的同时,能够一直按我的等效键(回车键)。
    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()
            }
        }