尝试劫持根视图控制器时收到SIGABRT错误

时间:2019-01-24 03:53:43

标签: swift sigabrt rootviewcontroller

我试图根据用户的NSUserDefaults中数组是否为空来打开应用程序的其他视图控制器。本质上,如果用户先前已将数据保存在应用程序中,则该应用程序将打开以供他们选择数据。否则,该应用将打开欢迎屏幕。

但是,当数组为空时,我会看到为欢迎屏幕设置的背景颜色,但看不到在情节提要中布置的文本或按钮。当数组不为空并且应该打开数据页面时,我的应用程序崩溃并出现SIGABRT错误。我检查了所有有问题的视图控制器的插座,似乎没有断开连接。此外,当我注释掉应用程序委托中的代码并将数据视图控制器设置为我的初始启动视图时,该应用程序运行良好。

完整的错误是“线程1:信号SIGABRT”,并在类AppDelegate中标记了该行。

我在应用程序委托中使用的代码如下:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        var accounts = loadAccounts()!

        if accounts.isEmpty {
            let welcomeController = WelcomeViewController()
            self.window!.rootViewController = welcomeController
        } else {
            let tableController = AccountTableViewController()
            self.window!.rootViewController = tableController
        }

        return true
    }

    func loadAccounts() -> [Account]? {
        return NSKeyedUnarchiver.unarchiveObject(withFile: Account.ArchiveURL.path) as? [Account]
    }

1 个答案:

答案 0 :(得分:0)

也许UIWindow设置不正确。

let bounds = UIScreen.main.bounds
self.window = UIWindow(frame: bounds)
self.window?.rootViewController = `your view controller`
self.window?.makeKeyAndVisible()

还有什么可能出问题?

var accounts = loadAccounts()!

此行是您的罪魁祸首。确切地说,我猜是这个符号!。您正在尝试从数据库或文件系统中获取数据,并希望它们始终存在。

考虑一下,这不可能一直都是真的。

 # check if account array is not empty; I would have returned nil if it would be empty and so we can avoid that extra check here.
 if let accounts = loadAccounts(), !accounts.isEmpty {

     let tableController = AccountTableViewController()
     self.window!.rootViewController = tableController

     return true
 }

 let welcomeController = WelcomeViewController()
 self.window!.rootViewController = welcomeController

此外,如果您可以从调试控制台中提供有关错误消息的更多信息。这样我就能以更好的方式提供帮助。