无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT

Posted

技术标签:

【中文标题】无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT【英文标题】:Could not cast value of type 'UIViewController' to 'name.mainVC' - signal SIGABRT 【发布时间】:2020-02-25 12:32:27 【问题描述】:

我对编码和尝试制作入门屏幕非常陌生。我在我的入职故事板中使用了 3 个屏幕,它们工作正常,直到我尝试切换故事板。它在行中显示“信号 SIGABRT”

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

错误:

2020-02-25 13:19:17.128892+0100 ihopeyoureokay[89853:2434827] [故事板] Interface Builder 文件中的未知类 mainVC。不能 将“UIViewController”(0x110a5b940)类型的值转换为 'ihopeyoureokay.mainVC' (0x1060cc918)。 2020-02-25 13:19:17.129648+0100 ihopeyoureokay[89853:2434827] 无法转换类型的值 'UIViewController' (0x110a5b940) 到 'ihopeyoureokay.mainVC' (0x1060cc918)。

我在这个文件中的完整代码是:

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 
    

这里还有另一个可能会有所帮助的屏幕截图:

有人知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

您需要检查您的检查器,选择您的视图控制器并检查是否必须如下所示:

as! mainVC 要求你有一个名为 mainVC 的类

另外你不需要创建两个不同的故事板,你可以创建两个不同的控制器,并根据你的条件制作你的视图控制器。

【讨论】:

【参考方案2】:

将storyboard id设为mainVC,让代码运行起来!

【讨论】:

【参考方案3】:

首先,如果您不使用SwiftUI,则不需要使用SceneDelegate.swift。您应该执行以下操作:

确保您有一个名为 actual.storyboard 的故事板。 在属性导航器中将 MainViewController 故事板 ID 设置为 mainVC。 不要使用强制解包,使用guard letif 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)
    

【讨论】:

我已经将我的故事板 ID 设置为 mainVC,但将其更改为 guard let 有帮助!非常感谢

以上是关于无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

无法将“testViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”

无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT

无法将'ViewController.Type'类型的值转换为预期的参数类型'UIViewController'

无法将类型“类”的值分配给类型“[类]”