Xcode Swift:如何在每个viewDidLoad之后阻止变量更改,如何保存和更新来自不同ViewControllers的数据?

时间:2015-02-05 14:11:42

标签: xcode variables swift segue

我的主VC中有一些变量,当用户单击另一个VC中的按钮时,prepareForSegue会将新值传递给主VC并更新标签。

但是,当用户再次点击它时,它会回到初始值,所以它没有增加,因为在viewDidLoad中设置了值?

MainVC:

var statsHealth:Int = 0

override func viewDidLoad() {
    super.viewDidLoad()

    healthLabel.text = String("Health: \(statsHealth)/10")

}

另一个VC:

覆盖func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?){

    if (segue.identifier == "startSegue") {

        let startVC = segue.destinationViewController as ViewController

        startVC.statsHealth += 1

    }

它显示为0,然后显示为1,然后再显示0,然后显示1而不是2,3,4等。

有什么想法吗?

BR

尼尔斯

2 个答案:

答案 0 :(得分:1)

因此,根据您的描述,我假设视图控制器结构是这样的:

AnotherVC - > MainVC

MainVC呈现在AnotherVC之上。当你回到AnotherVC时,你是否完全解雇了MainVC?如果是这样,那么每次从AnotherVC转到MainVC时,它都会启动一个新的ViewController,之前保存的变量不再存在。

如果要在MainVC中保留此结构并更改变量,请在AnotherVC中保留mainVC的引用。然后,您可能希望以编程方式呈现它,而不是在故事板中连接。

class AnotherVC {
    var mainVC: MainVC?

    func presentMainVC() {
         var targetVC = UIViewController()
         if self.mainVC != nil {
             targetVC = self.mainVC

         } else {
             let storyboard = UIStoryboard(name: "Your-storyboard-name", bundle: nil)
             targetVC: MainVC = storyboard.instantiateViewControllerWithIdentifier("The-main-VC-identifier") as MainVC
             self.mainVC = targetVC
         }

         //you can change your variable here
         mainVC.statsHealth += 1

         self.presentViewController(self.mainVC, animated: true, completion: nil)
    }

如果你的mainVC在任何情况下都在AnotherVC之上,你可以恢复参考方向。

答案 1 :(得分:1)

也许不是最快的'斯威夫特'这样做的方式,但肯定运作良好....

创建一个名为Variables.swift的文件,该文件将保存您所有的' universal'变量(如果这些变量将出现在每一页上,我认为没有理由这不是最好的方法 - 当然这是最容易理解的!)

在Variables.swift中,保存所有通用变量

struct Variables {
    static var statsHealth = 0
.....
}

然后,在每个其他页面中,随时访问它们

 healthLabel.text = String("Health: \(Variables.statsHealth)/10")

或设置它们

Variables.statsHealth += 1