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,可以很好地更改和更新变量。
我正在尝试创建一个滑块,以便在应用程序的初始加载时,滑块具有默认值,比如 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,可以很好地更改和更新变量。