如何更新滑块的最大值?

Posted

技术标签:

【中文标题】如何更新滑块的最大值?【英文标题】:how to update the maximum value of a slider? 【发布时间】:2020-01-19 08:59:24 【问题描述】:

我有一个应用程序,您可以在其中下注一定金额。您可以使用滑块来确定下注的金额。

在每一轮(掷骰子)中,您的总宝藏都会更新(无论输赢)。滑块的最大值与宝物的值相同。

我希望滑块在每次掷骰子后更新其最大值(即每次更新总宝藏时)。

这是一个很短的应用程序,所以我复制了整个代码


class ViewController: UIViewController 
    @IBOutlet weak var gains: UILabel!
    @IBOutlet weak var dicePlayer: UIImageView!
    @IBOutlet weak var diceComputer: UIImageView!

    //slider et label approprié
    @IBOutlet weak var slider: UIView!

    @IBOutlet weak var sliderValueLabel: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        // on appelle le generateur de gains ici
        gainsAleatoires()
        // et on genere aleatoirement les dés
        //lancerDeDes()

    

    //MARK: - Variables pour l'application
    //tableau qui contient le nom des differents dés
    let des: Array = ["one", "two", "three", "four", "five", "six"]

    // tableau qui genere les gains
    var generateurDeGains = Int.random(in: 100 ... 1000)

    // deux variables qui vont simuler les lancers pour le joueur et l'ordinateur
    var lancerJoueur: Int = 1
    var lancerOrdinateur: Int = 1

    // deux variables pour enregistrer le tresor initial ainsi que le tresor mis a jour
    var initialGains = 0




    //MARK: - Gestion lancer de dés

    @IBAction func boutonLancerDes(_ sender: UIButton) 
        // on appelle la fonction lancer de dés
        lancerDeDes()

    
    //MARK: - Gestion reinitialisation du jeu et des gains

    @IBAction func boutonReinitialisation(_ sender: UIBarButtonItem) 
        // on appelle de nouveau la fonction gains aleatoires
        gainsAleatoires()
        // on change la valeur du slider
        //sliderValueLabel.text = "0"
    

    //MARK: - Fonction qui genere un gain aleatoire entre 100 et 1000
    func gainsAleatoires () 
        gains.text = String(generateurDeGains)

    
    //MARK: - Bouton pour changer la valeur de la somme que le joueur parie
    @IBAction func sliderValueChanged(_ sender: UISlider) 
        // on s'assure que la valeur du slider est affichée dans le label correspondant
        let currentValue = Int(sender.value)
        sliderValueLabel.text = String(currentValue)

        // on donne la valeur maximale du slider qui est celle des gains générés aleatoirement
        sender.maximumValue = Float(generateurDeGains)
    


    //MARK:- Fonction qui gere le lancer des deux dés
    func lancerDeDes() 
        //on rend aleatoire les lancers du joeur et de l'ordinateur
        self.lancerJoueur = Int.random(in: des.indices) + 1 // code qui rend les erreurs plus faciles a detecter
        //autre ecriture : self.lancerJoueur = Int.random(in: 1...6)
        self.lancerOrdinateur = Int.random(in: des.indices) + 1

        UIView.animate(withDuration: 0.5) 
            self.dicePlayer.image = UIImage(named: self.des[self.lancerJoueur - 1])
            self.diceComputer.image = UIImage(named: self.des[self.lancerOrdinateur - 1])

        
        // on appelle la fonction qui gere les scores
        gestionDesScores()
    

    //MARK: - Fonction qui gere les scores pour le joueur et l'ordinateur

    func gestionDesScores() 
        // 2 switch statements

        //on appelle ici la fonction qui va donner une alerte en fonction du resultat du lancer
        alertesEnFonctionDuResultat()
    

    //MARK: - Fonction qui gere les resultats
    func alertesEnFonctionDuResultat() 
        // si le joueur gagne
        if lancerJoueur > lancerOrdinateur 
            // on recupere la valeur actuelle des gains
            initialGains = generateurDeGains
            // on appelle l'alerte
            alerteSucces()
            // on met a jour la valeur des gains initiale
            initialGains = generateurDeGains + Int(sliderValueLabel.text!)!
            //on change la valeur totale des gains
            gains.text = String(initialGains)
            // et on change la valeur maximale du slider


         // si l'ordinateur gagne
        else if lancerJoueur < lancerOrdinateur 
            //idem
            initialGains = generateurDeGains
            alerteEchec()
            initialGains = generateurDeGains - Int(sliderValueLabel.text!)!
            gains.text = String(initialGains)
         // en cas de parité
        else 
            alerteParite()
        
        // fin de partie
        if gains.text == "0" 
            //on appelle la fonction fin de partie
            finDeLaPartie()

        

    

    //MARK: - Fonction avec alerte en cas de succès du joueur
    func alerteSucces() 
        let alert = UIAlertController(title: "Votre lancer est supérieur !", message: "Vous gagnez votre mise", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    

    //MARK: - Fonction avec alerte en cas d'echec du joueur
    func alerteEchec() 
        let alert = UIAlertController(title: "Votre lancer est inférieur !", message: "Vous perdez votre mise", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    

    //MARK: - Fonction en cas de parité entre joueur et ordinateur
    func alerteParite() 
        let alert = UIAlertController(title: "Vos lancers sont égaux !", message: "Vous devez de nouveau lancer les dés", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    

    //MARK: - Fonction qui gere le cas où on n'a plus de tresor et donc il faut reinitialiser
    func finDeLaPartie() 
        let alert = UIAlertController(title: "Vous n'avez plus d'argent !", message: "Réinitialisez ou secouez l'appareil pour débuter une nouvelle partie", preferredStyle: .alert)
        let action = UIAlertAction(title: "Compris", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    



【问题讨论】:

您是否尝试更改UISlidermaximumValue 属性? 【参考方案1】:

在你的alertesEnFonctionDuResultat(),更新gain后,可以添加:

// et on change la valeur maximale du slider
yourSlider.maximumValue = Float(initialGains)

无论如何,我认为您应该重新考虑一下您在应用中所做的事情... 例如,为什么在这里使用文本而不是滑块的值?

// on met a jour la valeur des gains initiale
initialGains = generateurDeGains + Int(sliderValueLabel.text!)!

还有,为什么每次滑块移动时都更新滑块maximumValue

// on donne la valeur maximale du slider qui est celle des gains générés aleatoirement
sender.maximumValue = Float(generateurDeGains)

【讨论】:

我试了第一段代码,slider.maximumValue 不起作用。 至于使用文本而不是滑块的值,这是因为我使用标签来显示该值。我一直使用字符串来在标签中显示某些内容 对于您突出显示的第三位代码,我希望我的滑块具有等于“generateurDeGains”的初始最大值,即:可以下注的最大金额。 嗯...sliderValueChanged 什么时候调用?

以上是关于如何更新滑块的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得可以移动滑块的最大速率(频率)?

jQuery UI Slider - 最大值(不是滑块的结尾)

使用 setOptions 动态更改属性后剑道滑块的问题

KnockoutJS 设置 jQuery Mobile 滑块的最大选项

是否可以根据其他表单的输入来更改 HTML5 范围滑块的最小值和最大值?

React-Native Slider滑竿使用