2016-07-22 3 views
0

Когда я пытаюсь передать данные моего класса Event другому контроллеру, я получаю сообщение об ошибке "fatal error: unexpectedly found nil while unwrapping an Optional value".Данные, отправляемые новому контроллеру View, равны нулю, разворачивание необязательного значения

Это мой вид контроллера, который посылает данные:

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! 
+0

Это потому, что 'eventDetailscontrollers' равен нулю в' eventDetailscontrollers? .event = event' – WMios

+0

Являются 'EventDetailscontrollers' и 'detailViewController' должен быть таким же? – WMios

+0

Да, они один и тот же контроллер вида –

ответ

0

Ваш проблема в том, что вы объявляете переменную eventDetailscontrollers, которая выглядит следующим образом:

var eventDetailscontrollers: EventDetailsController! 

Но вы никогда не присваивание значения к нему, так вот почему, если вы звоните

eventDetailscontrollers.event 

Это будет катастрофа, потому что eventDetailscontrollers является nil, поэтому он не имеет ни одного члена event в то время.

Но когда вы звоните

eventDetailscontrollers?.event 

Это не приведет к краху, потому что вы присваиваете значение для event члена только если eventDetailscontrollers не nil, это то, что означает, что восклицательный знак. eventDetailscontrollers на самом деле nil, поэтому никаких заданий не делается.

Итак, сначала необходимо инициализировать переменную eventDetailscontrollers.

Я предлагаю вам прочитать это руководство о optionals, а также этот о optional chaining

+0

Что инициализируется переменной? –

+0

Это зависит от того, для чего вы используете эту переменную. –

0

вопрос здесь:

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) 
} 
Смежные вопросы