Я пытаюсь Segue и передать строку, но я получаю ошибку - PullRequest
0 голосов
/ 08 апреля 2019

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

Тема 1: EXC_BAD_ACCESS

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "NormalPushupSegue" {
            let normalVC = segue.destination as! PopupViewController
            normalVC.formType = "Normal"
            performSegue(withIdentifier: "NormalPushupSegue", sender: self)
        }
        if segue.identifier == "DiamondPushupSegue" {
            let diamondVC = segue.destination as! PopupViewController
            diamondVC.formType = "Diamond"
            performSegue(withIdentifier: "DiamondPushupSegue", sender: self)
        }
        if segue.identifier == "WidePushupSegue" {
            let wideVC = segue.destination as! PopupViewController
            wideVC.formType = "Wide"
            performSegue(withIdentifier: "WidePushupSegue", sender: self)
        }
        if segue.identifier == "DeclinePushupSegue" {
            let declineVC = segue.destination as! PopupViewController
            declineVC.formType = "Decline"
            performSegue(withIdentifier: "DeclinePushupSegue", sender: self)
        }
    }

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Прежде всего, лучше безопасно развернуть контроллеры вида. Вот так:

if let myViewController = segue.destination as? MyViewController { 
    // Set up the VC, add some values and options
}

Второе - вам не нужно вызывать executeSegue , выполнение для segue уже вызывает ваш контроллер представления. Просто удалите executeSegue

Третье - вы можете упростить и применить такую ​​логику:

enum AppSegueName: String {
case Normal = "NormalPushupSegue"
case Diamond = "DiamondPushupSegue"
case Wide = "WidePushupSegue"
case Decline = "DeclinePushupSegue"
}

extension AppSegueName: CaseIterable {}

А при подготовке func используйте оператор switch \ case и сравните необработанное значение AppSegueName с segue.identifier

вроде так:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    AppSegueName.allCases.forEach {
        if $0.rawValue == segue.identifier {

            if let myViewController = segue.destination as? MyViewController { 
            myViewController.formType = $0 // formType is of type AppSegueName
            }
        }
    }
}
0 голосов
/ 08 апреля 2019

Вы не можете вызвать performSegue в prepare(for segue, это всегда приведет к ошибке, так как это будет вызываться рекурсивно

Удалить все

performSegue(withIdentifier: "NormalPushupSegue", sender: self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...