Swift: PrepareForSegue, Swift Cast failure

Я хотел бы выбрать одну ячейку в моем TableViewController . Текст ячейки должен быть передан через segue на метку FirstViewController. Я всегда получаю ошибку, показанную ниже.

Идентификатор правильный.

Мой код:

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "BackToCalculator") { //let myRow = tableView.indexPathForSelectedRow().row+1 let vc = segue.destinationViewController as FirstViewController vc.SelectedBundesland.text = "Test" } } 

Исключение:

0x103f1f5dc: jne 0x103f1f5d0; swift_dynamicCastClassUnconditional + 48 0x103f1f5de: leaq 0x3364d (% rip),% rax; «Быстрая динамическая броска не удалась» 0x103f1f5e5: movq% rax, 0xa456c (% rip); gCRAnnotations + 8 0x103f1f5ec: int3
0x103f1f5ed: movq% r14,% rax

Что не так?

5 Solutions collect form web for “Swift: PrepareForSegue, Swift Cast failure”

Более безопасный и прямой подход – это условный листинг или даже лучший протокол на основе следующего:

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if let vc = segue.destinationViewController as? FirstViewController { vc.SelectedBundesland.text = "Test" } else { print("Some other controller! \(segue.destinationViewController)") } } 

Это, безусловно, работает. Но если у вас есть несколько segues и multiple viewController, это может быть большой проблемой для информации и данных.

Рассмотрим подход к протоколу:

 protocol BundeslandProtocol { var SelectedBundesland: String {get set} } override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if var vc = segue.destinationViewController as? BundeslandProtocol { vc.SelectedBundesland.text = "Test" } } 

Чтобы выполнить вышеуказанную работу, вам просто нужно объявить ваш UIViewController для соответствия указанному протоколу:

 class AwesomeViewController: UIViewController, BundeslandProtocol { .... } 

Со временем вы сможете переименовать свои классы, изменить их, заменить и расширить свой проект, и вам не придется заботиться об изменении ссылок вокруг, пока протокол будет сохранять свою цель.

Нелегко сказать, где нарушен ваш код: обычно это происходит, когда вы забываете указать имя своего класса (FirstViewController в вашем случае) в раскадровке, для контроллера, для которого выполняется segue, см. Снимок экрана, он должен быть установлен вместо универсального класса UIViewController.

смотреть скриншот

Может быть, поздно в игре, но получал точно такую ​​же проблему. Проблема здесь заключалась в том, что ваш Segue указывал на контроллер Tab, а не на фактический ViewController, куда ему нужно было перейти. Я имею в виду второй скриншот, который вы предоставили Антонио. Если вы исправите это, он должен работать нормально.

У меня была аналогичная ошибка – я считаю, что segue.destinationViewController – это UINavigationController . Вы получаете сообщение об ошибке, потому что пытаетесь включить UINavigationController в свой класс FirstViewController.

Измените эту строку: let vc = segue.destinationViewController as FirstViewController

к этому: let vc = segue.destinationViewController.topViewController as FirstViewController

.topViewController – это контроллер верхнего уровня в стеке навигации, который теперь должен быть экземпляром FirstViewController

Проверьте свою раскадровку, я думаю, что вы делаете пометку «point» другому viewController по ошибке.

Попробуй это,

 self.performSegueWithIdentifier("BackToCalculator", sender: self) override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "BackToCalculator") { //let myRow = tableView.indexPathForSelectedRow().row+1 let vc = segue.destinationViewController as FirstViewController vc.SelectedBundesland.text = "Test" } 

U нужно вызвать self.performSegueWithIdentifier.

  • Установить масштаб UIScrollView по умолчанию
  • Xcode 6.3 сработает, когда я переименую проект
  • Неопределенные символы для архитектуры armv7 для FBSDKLoginCore
  • Содержимое помещено в UIPageViewController с помощью UINavigationController
  • Обновление до ошибки xcode 4 Нет архитектур для компиляции для
  • Как публиковать приложение iOS от имени клиента?
  • Как выбрать iOS-симулятор в качестве места назначения в Xcode?
  • Начало события UIPanGesture из нажатого состояния во время создания
  • Не удается пройти этап проверки отправки приложения с поддержкой iPhone 5
  • не удалось отправить пакет qLaunchSuccess
  • Тестирование на устройстве iPhone без SIM-карты
  • Interesting Posts

    Базовый URL RestKit – каталог, следующий за доменным именем

    Счетчик циклов низкого уровня в устройствах iOS

    Xcode8: использование литературных изображений в рамках

    Является ли Apple указателем локализованных терминов, которые он использует?

    Как установить размер UIBarButton в iOS 11 для соответствия размеру в iOS 10

    Основное имя объекта данных переименовывается

    performSegueWithIdentifier не инициирует Segue

    Как реализовать SpriteKit в приложении расширения WatchKit?

    Swift Error: Struct 'XX' должен быть полностью инициализирован до того, как элемент будет сохранен в

    Уведомление iOS о пустоте Firebase Push не отображается

    Это цикл удержания?

    Диалог отправки Facebook в приложении iOS

    Размер экрана iPhone 6s Plus, который отключается на iPhone 6 Plus

    Как я могу обновить представление каждый раз при нажатии элемента панели вкладок?

    dyld: lazy symbol binding failed: Символ не найден: _objc_setProperty_atomic

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.