Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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
Ios swift 3:如何添加UISlider?_Ios_Swift_Slider_Avaudioplayer_Core Audio - Fatal编程技术网

Ios swift 3:如何添加UISlider?

Ios swift 3:如何添加UISlider?,ios,swift,slider,avaudioplayer,core-audio,Ios,Swift,Slider,Avaudioplayer,Core Audio,我有ViewController和AVAudioPlayer。现在我有了这个代码 import UIKit import AVFoundation var audioPlayer = AVAudioPlayer() class ViewController: UIViewController { @IBOutlet weak var slider: UISlider! @IBOutlet weak var playButton: UIButton! var index = 0 var ti

我有
ViewController
AVAudioPlayer
。现在我有了这个代码

import UIKit
import AVFoundation

var audioPlayer = AVAudioPlayer()

class ViewController: UIViewController {

@IBOutlet weak var slider: UISlider!
@IBOutlet weak var playButton: UIButton!
var index = 0
var timer: Timer?

override func viewDidLoad() {
    super.viewDidLoad()

    if index == 0{

       let url = Bundle.main.url(forResource: "1", withExtension: "mp3")!

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer.prepareToPlay()
            //audioPlayer.play()
            //play(sender:AnyObject.self as AnyObject)

        } catch let error {
            print(error.localizedDescription)
        }
    }
}

@IBAction func slide(_ slider: UISlider) {
    audioPlayer.currentTime = TimeInterval(slider.value)
}

@IBAction func play(sender: AnyObject) {
    if !audioPlayer.isPlaying{
        audioPlayer.play()
        // **** The line below is the new line ****
        timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
        RunLoop.main.add(timer!, forMode: .commonModes)
    } else {
        audioPlayer.pause()
        playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal)
        timer?.invalidate()
    }
}

func updateSlider(_ timer: Timer) {
    slider.value = Float(audioPlayer.currentTime)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

我想添加UISlider,通过音频文件更改拖动。如何操作?

首先,您必须从滑块添加一个新的iAction,以确保在滑块值更改时通知您的类(在此处查找“响应用户交互”:

在此事件处理程序中,您必须设置音频当前时间

@IBAction func slide(_ slider: UISlider) {
    audioPlayer.currentTime = TimeInterval(slider.value)
}
要确保滑块根据当前时间更新其值,必须在启动播放器时添加计时器,该播放器调用更新滑块值的自定义方法

@IBAction func play(sender: AnyObject) {
    if !audioPlayer.isPlaying{
        audioPlayer.play()
        // **** The line below is the new line ****
        timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
        RunLoop.main.add(timer, forMode: .commonModes)
    } else {
        audioPlayer.pause()
        playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal)
        timer.invalidate()
    }
}
之后,您必须创建更新滑块值的方法

func updateSlider(_ timer: Timer) {
    slider.value = Float(audioPlayer.currentTime)
}
然后您必须设置滑块的最大值

override func viewDidLoad() {
    super.viewDidLoad()

    if index == 0{

       let url = Bundle.main.url(forResource: "1", withExtension: "mp3")!

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer.prepareToPlay()
            // **** These two lines below are new ****
            slider.maximumValue = Float(audioPlayer.duration)
            slider.value = 0.0
        } catch let error {
            print(error.localizedDescription)
        }
    }
}
最后,您必须在IBOutlets下面创建一个属性,用于保存计时器

var timer: Timer?

您想更改音量还是擦洗音频文件?@0x6368我想更改擦洗音频文件但要小心可能的保留周期,重复
定时器
会保留
self
,而
self
似乎会保留
定时器
invalidate()
应该会打破这个循环,但是在复制音频时离开屏幕可能需要一些清理。这是正常工作。但是,当我擦洗我的滑块是冻结。如何修复?编辑:我已经更新了的答案,将
计时器
包含在运行循环常见模式中,以修复滚动时滑块的冻结。我有一个问题
类“ViewController”没有初始值设定项
如何修复?我想你应该添加一个“?”到计时器:
var timer:timer?
否则不允许为
nil