我正在尝试创建一个滑块,以便在应用程序的初始加载时,滑块具有默认值,例如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.
答案 0 :(得分:1)
如果您要离开视图控制器,几乎可以肯定您正在销毁它,当您尝试返回时,它会再次被创建。例如,如果您使用segues,情况就是如此。
除非您使用导航控制器并在其上推动视图控制器,否则将从头开始再次创建视图控制器,因此将值设置为故事板中设置的滑块。
关于另一个话题,在类之外使用distanceMap之类的代码并不是一个好习惯,这可能会导致奇怪的行为。最好的做法是在课堂上拥有这个价值。
为了实现您的目标,您应该通过VC发送幻灯片的值,或者将其存储在其他地方。第一种选择真的不优雅,所以第二种选择是最好的。
例如,将其存储在整个应用程序生命周期中的单例中,只要出现此VC,您就可以向单例询问值。每当用户更改滑块中的值时,您都将其设置为单例。另一种解决方案是将其存储在数据库中,但这看起来有点过分。
答案 1 :(得分:0)
我设法找到了一种方法,我不需要在滑块中使用0。
if (mongoClient == null) mongoClient = new MongoClient(new ServerAddress(HOST, port), opts);
第一次滑块值现在为5,变量可以更改并更新。