Swift 滑块值不断变回 StoryBoard 值

Swift Slider Value Keeps Changing Back to StoryBoard Value

我正在尝试创建一个滑块,以便在应用程序的初始加载时,滑块具有默认值,比如 5。但是如果我将滑块值更改为 10,并保留 VC 然后回来,我希望该值为 10。我已尝试将此实现到我的应用程序中,但每次我离开后 return 到 VC,该值都会重置为我的值在 StoryBoard 中给出了它。我的代码确实通过将值 0 变为 1 来解决这个问题(代码第一次运行时总是如此),但我不认为它很优雅,而且还有更好的选择。我想我没有正确使用 viewDidAppear 和 viewDidLoad,但我不太确定如何改进我的代码。以下是我的尝试:

var distanceMap: Int = Int()


import UIKit


class MapSettingsVC: UIViewController {

    //IBOutlet for the slider
    @IBOutlet weak var rangeSlider: UISlider!

    // label for slider value
    @IBOutlet weak var distanceLabel: UILabel!

    //changes to slider value
    @IBAction func distanceRange(_ sender: UISlider) {

        distanceMap = Int(sender.value)
        distanceLabel.text = String(distanceMap)
    }

    // iboutlet to go to another viewController
    @IBAction func backButtonTapped(_ sender: AnyObject) {
        self.performSegue(withIdentifier: "mapSettingsGoBack", sender: self)
    }






override func viewDidAppear(_ animated: Bool) {



    rangeSlider.value = Float(distanceMap)
    distanceLabel.text = String(Int(rangeSlider.value))

    // I have initialized the label to be 0, so this will be FIRST value when the VC is loaded, and the if statement always runs the first time 
    if distanceLabel.text == "0" {
        rangeSlider.value = 1
        distanceLabel.text = "1"

    }



}
override func viewDidLoad() {
    super.viewDidLoad()

}

理想情况下,我什至不希望滑块具有“0”选项,并将默认设置为 5。

如果您要离开视图控制器,几乎可以肯定您正在破坏它,而当您试图返回时,它又被创建了。例如,如果您正在使用 segues,就会出现这种情况。

除非您使用导航控制器并将视图控制器推到其上,否则将重新从头创建视图控制器,因此将值设置为故事板中设置的滑块。

关于另一个话题,在 class 之外使用诸如 distanceMap 之类的代码并不是一个好的做法,它可能会导致奇怪的行为。最佳做法是将该值放在 class 内。

为了实现您的尝试,您应该通过 VC 发送幻灯片的值,或将其存储在其他地方。第一种确实不优雅,所以第二种最好。

例如,将其存储在贯穿应用程序生命周期的单例中,您可以在出现此 VC 时向单例请求值。每当用户更改滑块中的值时,您都在单例中设置它。另一种解决方案是将其存储在数据库中,但这看起来太过分了。

我设法找到了一种不需要在滑块中使用 0 的方法。

//initialize the global variable that way this is the first thing the slider will change to
var distanceMap: Int = 5


override func viewDidAppear(_ animated: Bool) {

    rangeSlider.value = Float(distanceMap)
    distanceLabel.text = String(Int(rangeSlider.value))

}

滑块值现在第一次为 5,可以很好地更改和更新变量。