Swift滑块价值不断变回StoryBoard价值

时间:2017-02-08 20:54:09

标签: swift uislider viewdidload viewdidappear

我正在尝试创建一个滑块,以便在应用程序的初始加载时,滑块具有默认值,例如5.但是如果我要将滑块值更改为10,并保留VC并返回,我希望值为10.我已经尝试将此实现到我的应用程序中,但每次我离开后返回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.

2 个答案:

答案 0 :(得分:1)

如果您要离开视图控制器,几乎可以肯定您正在销毁它,当您尝试返回时,它会再次被创建。例如,如果您使用segues,情况就是如此。

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

关于另一个话题,在类之外使用distanceMap之类的代码并不是一个好习惯,这可能会导致奇怪的行为。最好的做法是在课堂上拥有这个价值。

为了实现您的目标,您应该通过VC发送幻灯片的值,或者将其存储在其他地方。第一种选择真的不优雅,所以第二种选择是最好的。

例如,将其存储在整个应用程序生命周期中的单例中,只要出现此VC,您就可以向单例询问值。每当用户更改滑块中的值时,您都将其设置为单例。另一种解决方案是将其存储在数据库中,但这看起来有点过分。

答案 1 :(得分:0)

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

if (mongoClient == null) mongoClient = new MongoClient(new ServerAddress(HOST, port), opts);

第一次滑块值现在为5,变量可以更改并更新。