无法将“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 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)
【讨论】:
我已经将我的故事板 ID 设置为 mainVC,但将其更改为 guard let 有帮助!非常感谢以上是关于无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章
无法将“testViewController.Type”类型的值转换为预期的参数类型“UIViewController”
无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”
无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”
无法将“UIViewController”类型的值转换为“name.mainVC” - 信号 SIGABRT