2017-10-09 19 views
0

Bonjour les gars, j'ai besoin d'aide. J'essaie de créer un compte à rebours qui peut compter à partir des heures, minutes et secondes. En ce moment, je ne peux que créer le compte à rebours pour les secondes, mais je veux que l'application soit capable de mettre à jour les secondes, minutes et heures quand je "glisse" avec le curseur. Je trouve très difficile de mettre à jour l'étiquette correctement et d'ajouter "heures et minutes" à l'application. Quelqu'un peut-il m'aider s'il vous plaît à comprendre la logique.Création d'un compte à rebours avec un curseur dans Xcode

Ceci est le code que j'ai écrit jusqu'à présent et cela fonctionne bien seulement avec des secondes .. J'ai également ajouté un fichier audio qui sera joué à la fin comme vous pouvez le voir dans le code.

class ViewController: UIViewController { 

var secondsCount = 30; 
var timer = Timer() 
var audioPlayer = AVAudioPlayer() 

@IBOutlet weak var label: UILabel! 
@IBOutlet weak var labelmin: UILabel! 


    // Slideren som slider tid for sal 1 
@IBOutlet weak var sliderOutlet: UISlider! 
@IBAction func slider(_ sender: UISlider) 
{ 
    //Live changes the numbers 
    secondsCount = Int(sender.value) 
    label.text = String(secondsCount) + " Seconds" 

} 


    //Start button 
@IBOutlet weak var startOutlet: UIButton! 
@IBAction func start(_ sender: Any) 
{ 
     //Nederstående kode aktiverer funktionen counter() 
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.counter), userInfo: nil, repeats: true) 

    sliderOutlet.isHidden = true 
    startOutlet.isHidden = true 
} 

    //Counter function 
func counter() { 
    secondsCount -= 1 

    label.text = String(secondsCount) + " Seconds" 

    if (secondsCount == 0) 
    { 
     timer.invalidate() 

     audioPlayer.play() 
    } 
} 

    //Stop button 
@IBOutlet weak var stopOutlet: UIButton! 
@IBAction func stop(_ sender: Any) 
{ 
    timer.invalidate() 
    secondsCount = 30 
    sliderOutlet.setValue(30, animated: true) 
    label.text = "30 Seconds" 

    audioPlayer.stop() 

    sliderOutlet.isHidden = false 
    startOutlet.isHidden = false 
} 


    // viewDidLoad 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    do 
    { 
     let audioPath = Bundle.main.path(forResource: "1", ofType: ".mp3") 

     try audioPlayer = AVAudioPlayer(contentsOf: URL(fileURLWithPath: audioPath!)) 

    } 
    catch 
    { 
     //ERROR 
    } 



} 
+1

Quelles sont les valeurs minimum et maximum pour votre curseur? Et quelle est la valeur de départ? Et, que voulez-vous arriver lorsque la valeur du curseur change? – DonMag

+0

Peut-être une meilleure question: Dans quel format voulez-vous que le "compte à rebours" s'affiche? "02:34:21"? ou "2 heures, 34 minutes, 21 secondes"? ou autre chose? – DonMag

+0

Je voudrais que ce soit au format "2 heures, 34 minutes, 21 secondes" et le compte à rebours ne doit que compter à partir de 2 heures ... pas plus .. C'est parce que c'est dans un but précis. –

Répondre

0

Voici un moyen de convertir plusieurs secondes en heures formaté, minutes, chaîne secondes:

func hmsFromSecondsFormatted(seconds: Int) -> String { 

    let h = seconds/3600 
    let m = (seconds % 3600)/60 
    let s = seconds % 60 

    var newText = "" 

    if h > 0 { 
     newText += "\(h)" 
     if h == 1 { 
      newText += " hour, " 
     } else { 
      newText += " hours, " 
     } 
    } 

    if m > 0 || h > 0 { 
     newText += "\(m)" 
     if m == 1 { 
      newText += " minute, " 
     } else { 
      newText += " minutes, " 
     } 
    } 

    newText += "\(s)" 
    if s == 1 { 
     newText += " second" 
    } else { 
     newText += " seconds" 
    } 

    return newText 

} 

Ensuite, vous pouvez l'utiliser comme ceci:

label.text = hmsFromSecondsFormatted(secondsCount) 

Les multiples conditions if vous donnent deux choses:

  1. suite de noms de composants temps pluriel/singulier (vous obtenez « 1 seconde » au lieu de « 1 seconde ») et

  2. renvoie uniquement les composants de temps nécessaires. Ainsi, 45 secondes est retourné comme « 45 secondes » au lieu de « 0 heures, 0 minutes, 45 secondes »

Dans votre application réelle, vous aurez probablement aussi utiliser des chaînes localisées pour les noms des composants de temps.

Espérons que ça aide :)

+0

C'est exactement le genre de logique dont j'avais besoin merci beaucoup pour votre contribution! –