2016-11-19 10 views
0

私は、オーディオを制御するためにスライダーを使用しようとしていますが、すべて正常に動作しますが、スライダーの値をプレーヤーの現在の時間と同じにしようとするとクラッシュします。
しかし、updateSliderの機能の中に何かを印刷すると、それが正常に動作します。AVPlayerがUISlider Swiftで進行します

override func viewDidLoad() 
{  
    songTitle.text = mainSongTitle 
    background.image = image 
    mainImageView.image = image  
    downloadFileFromURL(url: URL(string: previewURL)!)    
    var time = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true) 
}  

func downloadFileFromURL(url : URL) 
{ 
    var downloadTask = URLSessionDownloadTask() 
    downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: 
    { 
     customURL , response , error in 
     self.play(url: customURL!) 
     self.slider.maximumValue = Float(player.duration) 
    }) 
    downloadTask.resume() 
} 

func play(url : URL) 
{ 
    do 
    { 
     player = try AVAudioPlayer(contentsOf: url) 
     player.prepareToPlay() 
     player.play()  
    } 
    catch 
    { 
     print(error) 
    } 
} 

@IBAction func PlayPressed(_ sender: Any) 
{    
    if player.isPlaying 
    { 
     player.pause()     
    } 
    else 
    { 
     player.play() 
    } 
} 

@IBAction func ChangerTimePlayer(_ sender: Any) 
{ 
    player.stop() 
    player.currentTime = TimeInterval(slider.value) 
    player.prepareToPlay() 
    player.play() 
} 

func updateSlider() 
{ 
    slider.value = Float(player.currentTime) 
} 
+0

アプリケーションクラッシュのクラッシュレポートを共有します。 – Adeel

答えて

0

のようなたぶんあなたが何かをする必要があります:あなたのダウンロード完了タスクが(あなたのスライダー)安全UIKitを使用するには、メインスレッドで呼び出される必要がある

func updateSlider(){ 
    slider.value = Float(player.currentTime/player.duration) 
} 
0

:場合

DispatchQueue.main.async { 
    self.play(url: customURL!) 
    self.slider.maximumValue = Float(player.duration) 
} 
関連する問題