重置 - 发出UIViewController

时间:2018-03-05 20:31:12

标签: ios swift viewcontroller

我的视图控制器:

class myViewController: UIViewController {
   var myvar = 0

   func count() {
     print(myvar)
     myvar+=1 
   }

}

其他视图控制器:

Interval(1) {
  myViewController().count()
}

上面的代码是我到目前为止的代码。但似乎存在一个大问题:

名为myvar的var得到了一些新的初始值,所以总是得到它的默认值“0”。

调用myViewController后,为什么myViewController().count()会重置?我怎样才能摆脱这种行为?

编辑:之前从未加载“myViewController”,这可能导致问题?!

编辑:必须有其他方式才能生成实例。因为多个文件正在使用多个实例,这将再次导致错误! (导致重置)

任何帮助都会非常感激:)

5 个答案:

答案 0 :(得分:0)

每次调用myViewController()时,都在初始化myViewController的新实例.count()。

我想你应该有类似的东西:

 let myVC = myViewController()

Interval(1) {
myVC.count()
}

答案 1 :(得分:0)

回答你的两个问题:

  1. 为什么:
  2. myViewController是你的班级。 myViewController()是类的实例。您可能拥有无限数量的一个类的实例。默认情况下,所有这些都将具有值0。如果您希望看到其他内容而不是0,那么您应该获得增加myvar变量的类的特定实例。

    1. 如何摆脱:
    2. 没有办法摆脱这个。这是它的工作原理。

      解决方案:请与我们分享您的业务逻辑/目标/解释您想要实现的目标/您在建设什么/最终结果是什么?

      但我的猜测是你要这样做:

      let myControllerInstance = myViewController()
      myControllerInstance.count()
      myControllerInstance.count()
      print(myControllerInstance.myvar) // expect 2 here
      

      更新:如果没有被调用则调用它:)可能设置“初始视图控制器”。

答案 2 :(得分:0)

myViewController是视图控制器实现的名称。 myViewController()是对没有任何参数的视图控制器实现的初始化程序的调用。这意味着,myViewController()创建一个新实例。你调用myViewController().count(),它会增加值,但是对于新创建的实例。

这里需要的是获取您在屏幕上显示的单个myViewController实例的引用。如果不了解视图控制器的层次结构,就不可能告诉你如何获得它(尽管你现在应该知道什么是问题以及如何处理它)。

答案 3 :(得分:0)

  

名为myvar的var获得了一种新的初始化

不是那种,它确实得到了新的初始化。

存在一个常见的错误/误解:默认初始值设定项myViewController()始终创建一个全新的控制器实例,它与所有其他实例不同,而且 - 更重要的是 - 来自故事板中设计的实例。

你摆脱这个问题的方式取决于你的设计,目前还不清楚。

答案 4 :(得分:0)

<强>问题

myViewController()

这行代码就在这里创建了一个myViewController的新实例。创建myViewController时,myvar设置为零。这就是看起来myVar被重置为零的原因&#34;每次调用间隔函数时。

var myvar = 0 //Called whenever you use myViewController()

更明确的方式来编写类以使其更明显:

class myViewController: UIViewController {
    var myvar: Int
    init() {
        myvar = 0
    }
...

<强>解决方案

let vc: myViewController = myViewController()
Interval(1) {
    vc.count()
}

专业提示

欢迎来到编程世界!我为你感到非常兴奋!

坚持使用标准命名约定:将myViewController重命名为MyViewController。

不要在名为count的函数中递增变量。从逻辑上讲,这没有任何意义。有人,甚至你,后来可能会使用这个函数,并忘记count()会增加内部变量。相反,改变计数就是这样做,得到计数。

专业版修改

class MyViewController: UIViewController {
    var myvar = 0
    func count() -> Int {
        return myvar
    }
    func incrementCount() {
        myvar += 1
    }
}
...
let vc = MyViewController()
Interval(1) {
    print(vc.count())
    vc.incrementCount()
}

建议阅读

Pure Functions

Swift style guide