Не удалось привести значение типа «UIViewController» к «name.mainV C» - сигнал SIGABRT - PullRequest
0 голосов
/ 25 февраля 2020

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

let mainVC = storyboard.instantiateViewController(identifier: "mainVC") as! mainVC

Ошибка:

2020-02-25 13: 19: 17.128892 + 0100 ihopeyoureokay [89853: 2434827] [Раскадровка ] Неизвестный класс mainV C в файле Interface Builder. Не удалось преобразовать значение типа «UIViewController» (0x110a5b940) в «ihopeyoureokay.mainV C» (0x1060cc918). 2020-02-25 13: 19: 17.129648 + 0100 ihopeyoureokay [89853: 2434827] Не удалось привести значение типа 'UIViewController' (0x110a5b940) к 'ihopeyoureokay.mainV C' (0x1060cc918).

1009 * Мой полный код в этом файле:
class ThirdViewController: UIViewController {

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

    @IBAction func Gotoactual(_ sender: Any) {
        let storyboard = UIStoryboard(name: "actual", bundle: nil)
        let mainVC = storyboard.instantiateViewController(identifier: "mainVC") as! mainVC
               self.present(mainVC, animated: true, completion: nil)
    }
}

и мой sceneDelegate выглядит следующим образом:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        let launchedBefore = UserDefaults.standard.bool(forKey: "hasLaunched")
        let launchStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let mainStoryboard = UIStoryboard(name: "actual", bundle: nil)

        var vc: UIViewController

        if launchedBefore {
            vc = mainStoryboard.instantiateInitialViewController()!
        } else {
            vc = launchStoryboard.instantiateViewController(identifier: "firststoryboard")
        }

        UserDefaults.standard.set(true, forKey: "hasLaunched")

        self.window?.rootViewController = vc
        self.window?.makeKeyAndVisible()

        guard let _ = (scene as? UIWindowScene) else { return }
    }
}

Вот еще один скриншот, который может помочь: screenshot

Кто-нибудь знает, что я могу делать не так?

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Вам нужно проверить своего инспектора, выбрать ваш viewcontroller и проверить, что должно быть следующим: this

Для as! mainVC необходим класс с именем mainVC

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

0 голосов
/ 25 февраля 2020

Прежде всего вам не нужно использовать SceneDelegate.swift, если вы не используете SwiftUI. Вы должны сделать следующее:

  • Убедитесь, что у вас есть раскадровка с именем actual.storyboard.
  • Установите MainViewController идентификатор раскадровки в mainVC в навигаторе свойств.
  • Не используйте принудительное развертывание, используйте операторы guard let или if let.

Вот пример кода:

class MainViewController: UIViewController {
    ...
}

class ThirdViewController: UIViewController {

    ...

    @IBAction func goToActual(_ sender: Any) {
        let storyboard = UIStoryboard(name: "actual", bundle: Bundle(for: MainViewController.self))
        guard let mainVC = storyboard.instantiateViewController(identifier: "mainVC") as? MainViewController else {
            print("Failed to get MainViewController instance!")
            return
        }
        self.present(mainVC, animated: true, completion: nil)
    }
}
0 голосов
/ 25 февраля 2020

Установите идентификатор раскадровки как mainVC, чтобы запустить код!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...