2016-11-08 2 views
1

У меня 3 сцены в моей раскадровке. Мой первоначальный контроллер просмотра является контроллером навигации, затем есть контроллер корневого представления отношения к UI ViewController (контроллер просмотра a), а затем у меня есть push-шаг от кнопки в ViewController до третьего ViewController (контроллер просмотра b) в место действия. Я дал push segue идентификатор. Теперь я пытаюсь подготовить мой SEGUE во 2-й контроллере вида (контроллер а) следующим образом:Swift 3 - Подготовка Segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "HistorySegue" { 
      if let viewController = segue.destination as? HistoryController { 
       viewController.detailItem = barcodeInt as AnyObject 
      } 
     } 
    } 

Однако, когда я запускаю этот код и нажать на кнопку в контроллере я получаю следующее сообщение об ошибке:

Неустранимая ошибка: попытка соединить неявно разворачиваемую опцию, содержащую нуль

Что я делаю неправильно?

+1

Что 'barcodeInt'? Подробнее, пожалуйста. – Lumialxk

+0

Какой тип 'detailItem' и' barcodeInt'? –

ответ

2
Replace your code with. It will not crash atleast. 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "HistorySegue" { 
      if let viewController = segue.destination as? HistoryController { 
       if(barcodeInt != nil){ 
       viewController.detailItem = barcodeInt as AnyObject 
       } 
      } 
     } 
    } 
0

Должно быть, barcodeInt определяется как неявно развернутый необязательными, как:

var barcodeInt:Int!

В том случае, если она равна нулю, при назначении его detailItem, из-за !, быстры принимает ваш слово для него, что там нет нильвы значение и разыгрывает его. Это ошибка времени выполнения. Лучше всего избегать ! в коде, который вы пишете (это нормально оставить, например, код Apple для IBOutlets), если это вообще возможно, и узнать больше об опциях, прежде чем возвращаться к неявным образом развернутым опциям. А потом все равно используйте их экономно.

Безопаснее код для вашей ситуации:

if let viewController = segue.destination as? HistoryController, 

    guard let barcodeInt = barcodeInt as? AnyObject else { 
     NSLog("Error: expected barcodeInt to be set") 
     return 
    } 

    viewController.detailItem = barcodeInt 

} 
Смежные вопросы