Bonjour,
Je souhaite faire une application avec différents calculs affairant à la pratique du cyclisme sur piste.
La majorité de mes pages seront constituées de 2 ou 3 PickerView.
A partir des sélections, l’appli effectuera un calcul.
Problème rencontré : quand je saisis ma liste en Double mes PickerView affichent des ?
et quand je saisis ma liste en String je j’arrive pas à convertir le String en Double pour pouvoir effectuer mon calcul
Ci après un test tout simple de calcul avec des doubles
var longueurPiste: Double = 250
var facteurConversionPiste: Double = 1000
var tempsAuTour: Double = 17
var facteurConversionTemps : Double = 3600
var convLongueurPiste: Double
var convTempsAuTour : Double
var vitesseCalculee : Double
convLongueurPiste = longueurPiste / facteurConversionPiste
print(convLongueurPiste)
convTempsAuTour = tempsAuTour / facteurConversionTemps
print(convTempsAuTour)
vitesseCalculee = convLongueurPiste / convTempsAuTour
print(vitesseCalculee)
et là le début du code correspondant au PickerView dans lequel je veux récupérer la longueurPiste pour effectuer mon calcul
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var pickerLongueur: UIPickerView!
@IBOutlet weak var longueurLabel: UILabel!
private let pickerLongueurData = ["200", "250", "500"]
override func viewDidLoad() {
super.viewDidLoad()
pickerLongueur.delegate = self
pickerLongueur.dataSource = self
}
// Nombre de colonne dans le pickerView
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
// Nombre d'élément dans le tableau de données Longueur
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerLongueurData.count
}
// Renvoie la données du tableau de données Longueur
internal func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerLongueurData[row]
}
// récupération de la sélection Longueur
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
longueurLabel.text = pickerLongueurData[row]
}
}
Ca faisait longtemps que je n’avais pas vu du UIKit Une raison particulière pour laquelle tu n’utilises pas SwiftUI pour ton app de cyclisme ?
Sinon pour ta question : tu dois séparer la notion de stockage de l’info (un tableau de Double) de l’affichage de l’info (des String attendues par ton UIPickerView).
Je te conseille de stocker des Double dans ton tableau de données :
private let pickerLongueurData = [200, 250, 500]
Et de les convertir en String au moment de l’affichage :
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
longueurLabel.text = "\(pickerLongueurData[row])"
//tu peux faire ce que tu veux ici avec ton double pickerLongueurData[row]
}
Bonjour,
merci pour la réponse. Pour répondre à la question de l’utilisation de UIKit ce n’est clairement pas un choix de ma part, c’est juste que je découvre le codage et que je n’ai pas les connaissances pour faire la différence. Je pars de très loin ;).
Je vais essayer d’adapter ton code à mon « appli ».
Encore merci
Re,
j’ai réussi à faire le calcul souhaité, merci.
Nouvelle étape, afficher un 2eme PickerView à 2 colonnes pour saisir les secondes et les dixièmes du temps au tour
Je te conseille de commencer dès maintenant avec SwiftUI si tu es débutant. C’est plus simple que UIKit et ça représente l’avenir alors que UIKit va progressivement disparaître (même si ça prendra du temps).
Voici un cours gratuit sur SwiftUI avec lequel tu peux commencer :
j’ai suivi tes conseils, j’ai commencé à coder sur SwiftUI
A nouveau il me manque « l’astuce » pour effectuer mon calcul : vitesseCalculee = (longueurPiste/1000) / (tempsTour/3600) à partir de mes Picker
Mon code ci dessous ne comporte pas les bonnes données ni la mise en forme
Merci d’avance
//
// Test2Picker.swift
// TrackBike
//
// Created by Thierry Lebeau on 24/11/2022.
//
import SwiftUI
struct Test2Picker: View {
@State var secondeSelection = 0
@State var dixiemeSelection = 0
@State var pisteSelection = 0
var secondes = [Int](10..<60)
var dixiemes = [Int](0..<10)
let longueurPiste = [200, 250, 333, 500]
var vitesseCalculee = Double()
var body: some View {
VStack {
Text("Longueur de la piste")
.font(.title)
.fontWeight(.semibold)
.foregroundColor(Color.blue)
Picker(selection: self.$pisteSelection, label: Text("")){
ForEach(0 ..< longueurPiste.count){ index in
Text("\(self.longueurPiste[index]) m").tag(index)
}
}
.pickerStyle(WheelPickerStyle())
Text("Temps au tour")
.font(.title)
.fontWeight(.semibold)
.foregroundColor(Color.blue)
GeometryReader { geometry in
HStack{
Text("Secondes")
Text("Dixièmes")
}
HStack {
Picker(selection: self.$secondeSelection, label: Text("")){
ForEach(0 ..< self.secondes.count){ index in
Text("\(self.secondes[index])'").tag(index)
}
}
.pickerStyle(WheelPickerStyle())
Picker(selection: self.$dixiemeSelection, label: Text("")){
ForEach(0 ..< self.dixiemes.count){ index in
Text("\(self.dixiemes[index])").tag(index)
}
}
.pickerStyle(WheelPickerStyle())
}
}
Text("Temps au tour : \(secondes[secondeSelection])'\(dixiemes[dixiemeSelection])")
.font(.largeTitle)
}
}
// vitesseCalculee = (longueurPiste/1000) / (tempsTour/3600)
}
struct Test2Picker_Previews: PreviewProvider {
static var previews: some View {
Test2Picker()
}
}
En effet, avec la version SwiftUI, la valeur qui sera sauvegardée dans ta variable est la valeur que tu auras déposée dans ta propriété tag.
A l’heure actuelle tu déposes la valeur index dans tes tag. Sachant que l’index correspond au numéro de ta ligne (et non au nombre de secondes) :
Je bascule en mode prof : « D’après toi, que devrais-tu mettre à la place de index pour que la variable secondeSelection contienne le nombre de secondes ? »