【问题标题】:pass value through another vc solution通过另一个 vc 解决方案传递价值
【发布时间】:2017-11-19 21:15:47
【问题描述】:

我很怀疑使用 prepare func 的 value 有什么不同

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "MainToTimer") {
        let vc = segue.destination as! YourViewController
        vc.var_name = "Your Data"
    }
}

或者例如声明全局变量

在 VC1 中

var justsimpleint:Int! = 0 //out side class

viewdidload(){
 justsimpleint = justsimpleint + 2
}

在 VC2 中

viewdidload(){
print(justsimpleint)   // it will be 2
}

【问题讨论】:

标签: ios swift


【解决方案1】:

使用全局变量在 VC 之间传递数据不是一个好主意。全局变量是应该小心使用的东西。如果您想将数据从视图控制器 A 传递到 A 呈现的视图控制器 B,请在 prepareForSegue 方法中进行。如果你想将数据从 View Controller B 传递到 View Controller A 并呈现 B,请使用委托模式。

全局变量不适合这个目的,因为:

  • 可以从任何地方访问它们。这样您就可以轻松地意外更改它们。
  • 更容易发现错误。假设您有一个全局变量val,VC A 和 B 将使用该变量。您将一些数据从 A 传递给 B。A 第一次呈现 B 时,数据已成功传递。第二次,由于您的逻辑中的一些错误,数据没有发送。这意味着 B 将收到您上次发送的数据,并且从外部看起来一切正常。如果你传递prepareForSegue 中的数据,如果没有传递数据,VC B 将无法获取数据。可能会发生unexpectedly found nil while unwrapping optional 错误。这样您就可以轻松判断出了什么问题。
  • 全局变量将保存对对象的引用,即使需要它的 VC 已被释放。这意味着如果你没有正确清理它,在关闭 VC 后,内存中会出现一些无用的对象。

【讨论】:

    【解决方案2】:

    默认情况下,假设您正在使用情节提要,您应该使用segues 将数据传递给下一个视图控制器。

    如果您希望全局变量在整个应用程序中共享,全局变量会很有用,您可以创建一个Singleton 类来设置全局属性。

    另外,为了在视图控制器之间传回,您可以创建一个 delegate 来实现它,您可能需要检查Passing data back from view controllers Xcode

    如果您不熟悉与代表一起工作,您可能还想查看this answer

    【讨论】:

    • ty 解释一下
    猜你喜欢
    • 2012-03-31
    • 2021-07-29
    • 2021-05-20
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2014-09-23
    • 2011-02-19
    相关资源
    最近更新 更多