2014-09-17 16 views
6
var songs = MPMediaQuery() 
var localSongs = songs.items 
songList = NSMutableArray(array: localSongs) 

tableView.reloadData() 

var song = MPMediaItem(coder: songList[0] as NSCoder) 

var currentItem = AVPlayerItem(URL: song.valueForProperty(MPMediaItemPropertyAssetURL) as NSURL) 

player.replaceCurrentItemWithPlayerItem(currentItem) 

player.play() 

var songTitle: AnyObject! = song.valueForProperty(MPMediaItemPropertyTitle) 

songName.text = songTitle as? String 

sliderOutlet.value = Float(player.currentTime()) // <<-Error here 

sto costruendo un lettore musicale e voglio un cursore per evidenziare la durata della canzone, ma ottengo questo erroreXcode 6- SWIFT- Fusioni CMTime come float

Impossibile trovare un overload per 'init' che accetta gli argomenti forniti

Penso che il problema sia la conversione di CMTime in Float.

risposta

15

CMTime è una struttura di , contenente una value, timescale e altri campi, quindi non si può solo "cast" ad un valore in virgola mobile.

Fortunatamente, c'è una funzione di conversione CMTimeGetSeconds():

let cmTime = player.currentTime() 
let floatTime = Float(CMTimeGetSeconds(player.currentTime())) 

Aggiornamento: Come di Swift 3,player.currentTime restituisce un TimeInterval che è un tipo alias per Double. Pertanto la conversione di Float semplifica in

let floatTime = Float(player.currentTime) 
+1

Sì, funziona Grazie @Martin PS: C'è un suggerimento per capire cose come queste da solo in futuro? (oltre a chiedere qui ovviamente :)) ho provato a leggere il riferimento CMTime ma non riuscivo a capirlo. – Abdou23

+0

@ Abdou023: Bene, 'CMTimeGetSeconds()' * è * documentato in https://developer.apple.com/library/prerelease/ios/documentation/CoreMedia/Reference/CMTime/index.html. Puoi anche cmd-clic su un tipo o un metodo nel file sorgente Swift (ad es. Su CMTime), che ti porta alla definizione Swift dove troverai i metodi correlati. –

0

CMTime è una struttura, che contiene un valore, calendario, bandiere e epoca. Quindi non puoi semplicemente "lanciarlo" su un valore in virgola mobile.

È possibile utilizzare il valore scrivendo direttamente

sliderOutlet.value = Float(player.currentTime().value) 

Ma questo sarà solo dare il valore del giocatore, che è espresso in millisecondi. Per ottenere il valore in secondi si utilizza questo:

sliderOutlet.value = Float(CMTimeGetSeconds(player.currentTime())) 

Mente bene questo potrebbe anche non sarà il modo corretto si dovrebbe avere il valore del vostro cursore.