Как заставить Segu развернуть работу между обычными переходами в одном контроллере представления? - PullRequest
0 голосов
/ 29 сентября 2019

Извините, если название немного расплывчато.Я все еще изучаю swift и segues, и у меня есть 3 контроллера вида с именами EarthViewController, MoonViewController и JupiterViewController.

Это segues, которые работают:

EarthViewController -> MoonViewController
MoonViewController -> JupiterViewController
JupiterViewController -> MoonViewController, 
and even JupiterViewController -> EarthViewController, 

, но откат от MoonViewController -> EarthViewController продолжает выдавать ошибку Thread 1: Signal SIGABRT, где я прокомментировал //ERROR HERE при попытке вернуться квид Земли.Вот схема и код на данный момент:

enter image description here

EarthViewController (ViewController)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let des = segue.destination as! MoonViewController 

        if (segue.identifier == "toMoonView")
        {
            print("Went to the moon")
        }
    }

    @IBAction func backFromMoon(segue: UIStoryboardSegue){

        if let scVC = segue.source as? MoonViewController
        {
            print ("Back from the Moon to Earth")
        }
    }

    @IBAction func backFromJupiterToEarth(segue: UIStoryboardSegue){

        if let scVC = segue.source as? JupiterViewController
        {
            print ("Back from Jupiter to Earth")
        }
    }
}

MoonViewController

import UIKit

class MoonViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

//------------------------------------------------------------------------
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let des = segue.destination as! JupiterViewController //<- ERROR HERE

        if (segue.identifier == "toJupiterView")
        {
            print("Went to Jupiter")
        }
    }
//-----------------------------------------------------------------------
    @IBAction func backFromJupiter(segue: UIStoryboardSegue){

        if let scVC = segue.source as? JupiterViewController
        {
            print ("Back from Jupiter to the Moon")
        }
    }
}

JupiterViewController (еще ничего не добавлено)

import UIKit

class JupiterViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


}

Любая помощь очень ценится!Спасибо!

1 Ответ

1 голос
/ 29 сентября 2019

Эта функция в MoonViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let des = segue.destination as! JupiterViewController //<- ERROR HERE

    if (segue.identifier == "toJupiterView")
    {
        print("Went to Jupiter")
    }
}

вызывается как для регулярных сегментов, так и для сегментов раскручивания.Когда вы переходите на JupiterViewController, тогда segue.destination действительно имеет тип JupiterViewController.Но когда вы раскручиваете на ViewController, segue.destination имеет тип ViewController.

Во втором случае приведение к силе as! JupiterViewController завершается сбоем из-за неправильного типа.

Один из способов исправить это - переместить объявление des внутри if, когда вы определили пункт назначения:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toJupiterView"
    {
        let des = segue.destination as! JupiterViewController
        print("Went to Jupiter")
    }
}
...