【问题标题】:Pass data between 2 ViewControllers [duplicate]在 2 个 ViewController 之间传递数据 [重复]
【发布时间】:2017-12-27 13:21:30
【问题描述】:

我正在尝试将数据从我的第一个 ViewController 发送到我的第二个。

使用简单的 Int 可以正常工作,但使用此 Double 则无法正常工作,我不明白为什么。因此,如果您能解释为什么它不起作用,那就太酷了!

我在第一个 ViewController 中的声明:

var time: Double? = 0.00

然后我尝试将它发送到我的另一个 ViewController:

let vc = segue.destination as! MySecondViewController
   vc.rows = rows[pathForAVC]
   vc.lap = lap[pathForAVC]
   vc.indexPath = pathForAVC
   vc.time = rows[pathForAVC]["Time"]! as! Double

致命错误:在展开可选值时意外发现 nil

还有我的第二个 ViewController:

var time: Double? = 0.00
topLabel.text = "\(time!)"

注:

rows 是一个字典:

var rows: [[String : AnyObject]] = [[:]]

我真的不明白我的错误......

【问题讨论】:

  • 这与传递你的价值没有任何关系......对我来说,rows[pathForAVC]["Time"] 似乎不包含一个值,你正在强制解开它。尝试使用 if let unwrappedTime = rows[pathForAVC]["Time"] as? Double {} 安全地打开它
  • 那里有太多的力量展开。你真的应该避免使用它。永远。
  • 此外,如果您打算将Doubles 存储在您的字典中,那么它的类型实际上应该是[[String : Any]]。 Double 符合 Any 而不是 AnyObject。

标签: ios swift uiviewcontroller


【解决方案1】:

问题是你强制解开一个可能不存在的值:

vc.time = rows[pathForAVC]["Time"]! as! Double

如果rows[pathForAVC]["Time"]! 为零,您的应用程序将崩溃。您应该真的避免使用!,除非您的应用程序只是无法在没有该值的情况下继续运行。而且这些情况应该是罕见的。

您应该使用这样的if let 语句安全地解开您的值:

if let unwrappedTime = rows[pathForAVC]["Time"] as? Double {
    print(unwrappedTime)
}

(我现在不在 Xcode 附近,但上面的代码应该足够接近,可以从编译器获得有价值的提示)。

如果您需要更多说明,请告诉我。

【讨论】:

  • 谢谢你们!现在我已经了解如何清楚地打开一个值。而且效果很好:)
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2017-01-22
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多