2015-10-27 1 views
1

Я пытаюсь передать данные с PFTableViewCell на следующий контроллер представления (подробности) с помощью функции prepareForSegue. Я думаю, что я ввел правильный код, но когда я запускаю приложение и нажимаю на ячейку, мое приложение падает, и я получаю это сообщение «неожиданно найдено нуль при распаковке необязательного значения». Я пробовал много вариантов для функции prepareForSegue для передачи данных, но никогда не появлялся на следующем контроллере представления.Ошибка при подготовкеForSegue «неожиданно найдена при открытии необязательного значения»

В моей FirstViewController я этот код написан:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      if segue.identifier == "Detail" { 
       if let destination = segue.destinationViewController as? ResponseViewController { 
       let path = tableView?.indexPathForSelectedRow! 
       let cell = tableView!.cellForRowAtIndexPath(path!) as! Post 
       destination.name = (cell.name.text!) 
       destination.message = (cell.message.text!) 
       } 

Вот код, чтобы отобразить данные, передаваемые в ResponseViewController:

var name = String?() 
    var message = String?() 

@IBOutlet weak var userName: UILabel! 
@IBOutlet weak var userMessage: UILabel! 

override func viewDidLoad() { 
     super.viewDidLoad() 
    userName.text! = name! 
    userMessage.text! = message! 
} 

Теперь, как исправить эту проблему или еще лучше как я могу подготовитьForSegue в swift 2.0?

+0

одна из ваших переменных равна нулю - вы не можете использовать значение nil в ваших выражениях. Если вы отключите 'nil', используя '!' ваша программа вылетает с этим сообщением об ошибке. (Swift заставляет вас иметь дело с значениями «nil» во время компиляции, а также во время выполнения, как с Obj-C). – nielsbot

+0

попробуйте заменить все '!' с '?' и получить ваш код для компиляции таким образом. – nielsbot

ответ

1

Одна из ваших необязательных переменных содержит nil.

Использование '!' принудительно разворачивает необязательные значения. Если опция содержит nil, когда она распакована, ваша программа вылетает с этим сообщением об ошибке. Старайтесь не использовать силовое литье (as!) и принудительно разворачивать.

Вот нильпотока Безопасная версия

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      if segue.identifier == "Detail" { 
       if let destination = segue.destinationViewController as? ResponseViewController 
       , path = tableView?.indexPathForSelectedRow 
       , cell = tableView?.cellForRowAtIndexPath(path) as? Post 
      { 
       destination.name = cell.name.text ?? "nil" 
       destination.message = cell.message.text ?? "nil" 
      } 

и

var name: String? 
var message: String? 

@IBOutlet weak var userName: UILabel? 
@IBOutlet weak var userMessage: UILabel? 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    userName?.text = name ?? "nil" 
    userMessage?.text = message ?? "nil" 
} 

N.b .:

  • ?? является оператором нуль-коалесцирующий. Если значение слева - nil, то значение справа заменяется.
  • Вы можете дополнительно вызвать методы по необязательному значению с помощью устройства доступа ?.. Если значение слева - nil, результат будет короткое замыкание до nil
+0

ОК, мое приложение больше не разбивается (спасибо за это!), Но данные от первого контрольного контроллера не перешли в ResponseViewController. Вы знаете, почему это и как я могу это сделать? – JoshyJay

+0

Ну, это была проблема: одно из ваших значений - _nil_. Вы должны отслеживать, почему именно _nil_ вместо ожидаемого значения. Вы можете задать отдельный вопрос? – nielsbot

+0

Извините, я новичок в кодировании. Что вы имеете в виду, отслеживая, почему это ноль? И если задать отдельный вопрос, я могу помочь мне решить эту проблему? Я застрял на ней с моей командой больше недели. – JoshyJay