【问题标题】:Data being sent to new View Controller is nil, unwrapping an Optional Value发送到新视图控制器的数据为零,展开可选值
【发布时间】:2016-11-26 19:44:00
【问题描述】:

当我尝试将 Event 类的详细信息传递给另一个控制器时,我收到一条错误消息,提示 "fatal error: unexpectedly found nil while unwrapping an Optional value"

这是我发送信息的视图控制器:

var eventDetailscontrollers: EventDetailsController!

func showDetailView(event: Events){
    let mainStoryBoarrd: UIStoryboard = UIStoryboard(name:"Main", bundle:nil)
    let detailsViewController: UIViewController = mainStoryBoarrd.instantiateViewControllerWithIdentifier("eventDetailsID")
    eventDetailscontrollers?.event = event //this sends all info as nil
    eventDetailscontrollers.event = event //this causes error

    print(event.name)      // this prints event name fine

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

这是我将数据发送到的类:

var event: Events!   {
    didSet  {
        eventPriceLabel.text = event!.date //does nothing
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    let string = event?.name
    print(string)// prints null
}

我的活动课程:

class Events: NSObject {
    var name: String!
    var date: String!
    var address: String!
    var ticketPrice: Int!

【问题讨论】:

  • 这是因为eventDetailscontrollerseventDetailscontrollers?.event = event 中为零
  • eventDetailscontrollersdetailsViewController 应该是一样的吗?
  • 是的,它们是同一个视图控制器

标签: ios xcode debugging error-handling swift2


【解决方案1】:

你的问题是你声明了变量eventDetailscontrollers,如下:

var eventDetailscontrollers: EventDetailsController!

但是你从来没有给它赋值,所以这就是为什么如果你调用

eventDetailscontrollers.event

这会崩溃,因为eventDetailscontrollersnil,所以它当时没有成员event

但是当你打电话时

eventDetailscontrollers?.event

这不会崩溃,因为只有当eventDetailscontrollers 不是nil 时才为event 成员赋值,这就是感叹号的含义。 eventDetailscontrollers 实际上是nil,所以没有赋值。

所以需要先初始化eventDetailscontrollers变量。

我建议您阅读有关 optionals 的指南,以及有关 optional chaining 的指南

【讨论】:

  • 变量的初始化位置是什么?
  • 这取决于您使用该变量的目的。
【解决方案2】:

问题就在这里:

func showDetailView(event: Events){
    let mainStoryBoarrd: UIStoryboard = UIStoryboard(name:"Main", bundle:nil)
    let detailsViewController: UIViewController = mainStoryBoarrd.instantiateViewControllerWithIdentifier("eventDetailsID")
    eventDetailscontrollers?.event = event //this sends all info as nil
    eventDetailscontrollers.event = event //this causes error

    print(event.name)      // this prints event name fine

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

你有两个应该相同的变量:

func showDetailView(event: Events){
    let mainStoryBoarrd: UIStoryboard = UIStoryboard(name:"Main", bundle:nil)
    eventDetailscontrollers = mainStoryBoarrd.instantiateViewControllerWithIdentifier("eventDetailsID")
    eventDetailscontrollers?.event = event //this sends all info as nil
    eventDetailscontrollers.event = event //this causes error

    print(event.name)      // this prints event name fine

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多