You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新iOS应用中Slider的最大值?附完整代码

解决iOS博彩应用中Slider最大值与总资产同步的问题

我仔细看了你的代码,核心问题是每次总资产更新后没有主动触发Slider最大值的同步,而且变量命名和管理有点混乱(比如generateurDeGains和initialGains的职责重叠),导致同步逻辑没跟上。咱们一步步来修复:

关键问题分析

  1. 当前你只在sliderValueChanged方法里设置了Slider的最大值,但这个方法只有用户拖动Slider时才会触发,总资产更新(输赢后)时不会自动调用。
  2. 变量generateurDeGains是初始随机资产,但后续更新的是initialGains,两者没有关联,导致Slider无法获取最新的总资产值。

解决方案步骤

1. 统一总资产变量

把分散的资产变量合并成一个currentBalance,专门用来跟踪当前用户的总资产,避免混淆:

// 替换原来的generateurDeGains和initialGains
var currentBalance: Int = 0

2. 初始化资产时同步Slider最大值

在gainsAleatoires函数里初始化资产的同时,直接设置Slider的最大值:

func gainsAleatoires () {
    currentBalance = Int.random(in: 100 ... 1000)
    gains.text = String(currentBalance)
    // 初始化时同步Slider最大值
    slider.maximumValue = Float(currentBalance)
    // 同时重置Slider值为0
    slider.value = 0
    sliderValueLabel.text = "0"
}

注意:你的代码里把Slider的IBOutlet声明成了UIView,这里要改成UISlider才能访问滑块的属性,否则会报错!

3. 总资产更新后立即同步Slider

在alertesEnFonctionDuResultat函数里,每次更新currentBalance后,立刻更新Slider的最大值,同时确保滑块当前值不超过新的最大值:

func alertesEnFonctionDuResultat() {
    let betAmount = Int(sliderValueLabel.text!) ?? 0
    
    if lancerJoueur > lancerOrdinateur {
        alerteSucces()
        currentBalance += betAmount
    } else if lancerJoueur < lancerOrdinateur {
        alerteEchec()
        currentBalance -= betAmount
        // 防止资产变成负数
        currentBalance = max(currentBalance, 0)
    } else {
        alerteParite()
    }
    
    // 更新显示的资产
    gains.text = String(currentBalance)
    
    // 同步Slider最大值
    slider.maximumValue = Float(currentBalance)
    // 如果当前滑块值超过新的最大值,自动调整到最大值
    if slider.value > slider.maximumValue {
        slider.value = slider.maximumValue
        sliderValueLabel.text = String(Int(slider.maximumValue))
    }
    
    // 检查是否破产
    if currentBalance == 0 {
        finDeLaPartie()
    }
}

4. 修正Slider的IBOutlet类型

把原来的@IBOutlet weak var slider: UIView!改成UISlider,否则无法访问滑块的maximumValue和value属性:

@IBOutlet weak var slider: UISlider! // 替换UIView为UISlider

5. 调整Slider值变化的逻辑

在sliderValueChanged里,直接用currentBalance作为最大值,确保每次拖动时最大值都是最新的:

@IBAction func sliderValueChanged(_ sender: UISlider) {
    let currentValue = Int(sender.value)
    sliderValueLabel.text = String(currentValue)
    sender.maximumValue = Float(currentBalance)
}

修改后的完整代码

class ViewController: UIViewController { 
    @IBOutlet weak var gains: UILabel! 
    @IBOutlet weak var dicePlayer: UIImageView! 
    @IBOutlet weak var diceComputer: UIImageView! 
    // 修正Slider的IBOutlet类型为UISlider
    @IBOutlet weak var slider: UISlider! 
    @IBOutlet weak var sliderValueLabel: UILabel! 
    
    override func viewDidLoad() { 
        super.viewDidLoad() 
        gainsAleatoires() 
    } 
    
    //MARK: - Variables pour l'application 
    let des: Array = ["one", "two", "three", "four", "five", "six"] 
    // 统一用currentBalance跟踪当前总资产
    var currentBalance: Int = 0
    var lancerJoueur: Int = 1 
    var lancerOrdinateur: Int = 1 
    
    //MARK: - Gestion lancer de dés 
    @IBAction func boutonLancerDes(_ sender: UIButton) { 
        lancerDeDes() 
    } 
    
    //MARK: - Gestion reinitialisation du jeu et des gains 
    @IBAction func boutonReinitialisation(_ sender: UIBarButtonItem) { 
        gainsAleatoires() 
    } 
    
    //MARK: - Fonction qui genere un gain aleatoire entre 100 et 1000 
    func gainsAleatoires () { 
        currentBalance = Int.random(in: 100 ... 1000)
        gains.text = String(currentBalance)
        // 初始化时同步Slider配置
        slider.maximumValue = Float(currentBalance)
        slider.value = 0
        sliderValueLabel.text = "0"
    } 
    
    //MARK: - Bouton pour changer la valeur de la somme que le joueur parie 
    @IBAction func sliderValueChanged(_ sender: UISlider) { 
        let currentValue = Int(sender.value) 
        sliderValueLabel.text = String(currentValue) 
        sender.maximumValue = Float(currentBalance) 
    } 
    
    //MARK:- Fonction qui gere le lancer des deux dés 
    func lancerDeDes() { 
        self.lancerJoueur = Int.random(in: des.indices) + 1 
        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]) 
        } 
        gestionDesScores() 
    } 
    
    //MARK: - Fonction qui gere les scores pour le joueur et l'ordinateur 
    func gestionDesScores() { 
        alertesEnFonctionDuResultat() 
    } 
    
    //MARK: - Fonction qui gere les resultats 
    func alertesEnFonctionDuResultat() { 
        let betAmount = Int(sliderValueLabel.text!) ?? 0
        
        if lancerJoueur > lancerOrdinateur { 
            alerteSucces() 
            currentBalance += betAmount 
        } else if lancerJoueur < lancerOrdinateur { 
            alerteEchec() 
            currentBalance -= betAmount 
            currentBalance = max(currentBalance, 0) // 防止负数资产
        } else { 
            alerteParite() 
        } 
        
        // 更新资产显示
        gains.text = String(currentBalance) 
        
        // 同步Slider最大值
        slider.maximumValue = Float(currentBalance)
        // 确保滑块值不超过新的最大值
        if slider.value > slider.maximumValue {
            slider.value = slider.maximumValue
            sliderValueLabel.text = String(Int(slider.maximumValue))
        }
        
        // 检查破产
        if currentBalance == 0 { 
            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) 
    } 
}

额外优化建议

  • 可以给sliderValueLabel.text的转换加个默认值(比如?? 0),避免因为空字符串导致崩溃。
  • 破产后可以自动重置Slider值为0,提升用户体验。

内容的提问来源于stack exchange,提问作者LEKYSMA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:42:50