Custom Segue дает поток 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7ffeedc6efe8) - PullRequest
0 голосов
/ 13 октября 2018

Я хочу реализовать пользовательский переход, используя CGAffineTransform.Я использую это в нескольких переходах.Но переход не работает, и он даже дает фатальную ошибку EXC_BAD_ACCESS в одной из сцен.Что-то странное здесь заключается в том, что переход не оживлялся на самой первой сцене LoginViewController.Так что следующая сцена в основном появляется из ниоткуда.Но программа не вылетала.Это дало мне сообщение об ошибке:

Unbalanced calls to begin/end appearance transitions for <MyTritonLink.TabBarDataController: 0x7faf351df200>.

Segue действительно запустил анимацию в следующей сцене.И то, как он выполняется, очень странно.Все отталкивается справа, но панель навигации вообще не движется.И это вылетало при выполнении src.present (рисунок и коды прилагаются ниже).Когда приложение аварийно завершает работу, панель навигации по-прежнему оставалась последней сценой, но все остальное уже выдвинуто справа.

Некоторые возможные причины, о которых я могу думать: я встроил почти каждую сцену в Navigation Controller и настроил ее длябыть в состоянии передать данные.Поэтому в методе prepare я сначала передаю данные:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "CourseTableViewSegue" {
        // Pass data
        (segue.destination as! NavigationDataController).browser = browser
        (segue.destination as! NavigationDataController).webView = webView
        (segue.destination as! NavigationDataController).selectedQuarter = selectedQuarter        
    }
}

Это может вызвать некоторые проблемы, но я не уверен, что это так.Также, возможно, встраивание сцены в контроллер навигации испортит пользовательский переход?Я боролся с этой проблемой в течение нескольких недель.Мне удалось обойти это, но я понимаю, что мне нужна эта анимация.Спасибо, что помогли мне.Если вам нужно больше кода, не стесняйтесь спрашивать.

Класс Segue:

class SegueFromRight: UIStoryboardSegue {
    override func perform() {
        let src = self.source
        let dst = self.destination

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: {dst.view.transform = CGAffineTransform(translationX: 0, y: 0)}, completion: {finished in src.present(dst, animated: false, completion: nil)}
        )
    }
}

Контроллер исходного кода

После анимации (сбой)

Код и сообщение об ошибке

...