Swift EXC_BREAKPOINT при назначении viewcontroller переменной в prepareForSegue

#ios #swift

#iOS #swift

Вопрос:

Я получаю сообщение об ошибке при попытке выполнить назначение переменной с моим destinationViewController.

Сообщение об ошибке выглядит следующим образом: Поток 1: EXC_BREAKPOINT (код= EXC_I386_BPT, подкод = 0x0)

Это в моей функции prepareForSegue.

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "LoginSegue"{

        let vc = segue.destinationViewController as LoggedInViewController
        vc.email = emailTextfield.text

    }
}
  

В другом файле это выглядит следующим образом.

 var email: String?
  

которая находится вверху.
Тогда это:

 override func viewDidLoad() {
    super.viewDidLoad()

    println("Email is:")
    println(email)
    println("Email was")
}
  

Но я никогда не захожу во второй файл.

Это строка let vc = segue.Назначение ViewController как LoggedInViewController, помеченное ошибкой.

Оба файла swift подключены к контроллерам навигации.

Я не знаю, что еще вам нужно, но я, конечно, опубликую весь код, который вам нужно понять!

Спасибо!

Ответ №1:

В вашем случае контроллером назначения является контроллер навигации, а не ваш LoggedInViewController, поэтому segue.destinationViewController as LoggedInViewController это ошибка, поэтому происходит сбой.

Попробуйте вот так

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "LoginSegue"{
            let navigationController = segue.destinationViewController as UINavigationController

        let vc = navigationController.topViewController as LoggedInViewController
        vc.email = emailTextfield.text

    }
}
  

Комментарии:

1. Черт возьми, это работает! : Я не могу проголосовать за это, получил только 1 повторение! : ( Но спасибо, что нашли время, чтобы помочь мне 🙂

2. Да, заметил! Теперь у меня есть!

3. Я только что получил аналогичную ошибку, я на самом деле использую то же самое, но вместо navigationController.viewControllers[0] я использую navigationController.topViewController . Есть ли разница?

4. @OliverBorchert Вы правы. вы должны использовать topViewController, чтобы получить текущий контроллер представления в стеке навигации. ViewControllers[0] выдает контроллер нижнего вида. Я только что отредактировал свой ответ, спасибо, что заметили.

Ответ №2:

На случай, если кто-нибудь придет сюда, потому что это первое попадание в EXC_BREAKPOINT:

Для меня это очень показательное исключение было вызвано из-за fatal error: unexpectedly found nil while unwrapping an Optional value , которое произошло из-за того, что IBOutlet использовался до его инициализации.