Calcul depuis un PickerView

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]
    }
}

Merci d’avance pour votre aide

Ca faisait longtemps que je n’avais pas vu du UIKit :grin: 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 :

internal func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return "\(pickerLongueurData[row])"
    }

et

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 :wink:

1 « J'aime »

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 :

1 « J'aime »

Bonjour

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 :wink:
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) :

:grin: 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 ? »