2017-02-08 4 views
-1

私は、アプリケーションの初期ロード時にスライダーがデフォルト値、たとえば5を持つようにスライダーを作成しようとしています。しかし、スライダーの値を10に変更するとVCを残して戻ってきて、値を10にしたいと思います。これを私のアプリに実装しようとしましたが、退室後にVCに戻るたびに、値はStoryBoardで値をリセットします。私のコードは0を1にすることでこれを一巡しますが(コードが最初に実行されるときは常にそうです)、私はそれがエレガントであるとは思わないし、より良い選択肢があります。私はviewDidAppearとviewDidLoadを正しく使用していないと思いますが、コードを改善する方法はあまりよく分かりません。以下は私の試みです:スウィフトスライダーの値をStoryBoardの値に戻す

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

スライダーに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になり、変数を変更して正常に更新できます。

+0

ユーザーがアプリケーションを再起動し、ViewDidLoadが再びトリガーすると、スライダーの値はデフォルトで5に戻ります。同様のグローバル変数が格納され、UISliderのアプリケーション全体で使用する必要があります。 –

1

にデフォルトセットを持っていますあなたがそれを破壊していることはほとんど間違いありません。あなたが戻ろうとするとき、それは再び作成されています。たとえば、セグを使用している場合は、これが該当します。

ナビゲーションコントローラを使用していて、ビューコントローラを押していない限り、ビューコントローラは最初から作成されるため、ストーリーボードに設定されているスライダに値を設定します。

別のトピックでは、クラスの外でdistanceMapなどのコードを使用することは実際には賢明ではありません。奇妙な動作につながる可能性があります。ベストプラクティスは、クラスの内部にその値を持つことです。

あなたがしようとしていることを達成するためには、あなたのVCを使ってスライドの価値を送るか、他の場所に保管してください。最初のオプションは実際にはエレガントではないので、2番目のオプションは最高です。

たとえば、これをアプリのライフスタイルを継承するシングルトンに保存して、このVCが表示されるたびにシングルトンの値を尋ねることができます。ユーザーがスライダーの値を変更するたびに、それをシングルトンに設定します。もう1つの解決策は、データベースに格納することですが、それは過度の方法に見えます。