Получать ошибку SIGABRT при попытке перехватить контроллер корневого представления - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь, чтобы мое приложение открывало другой контроллер представления в зависимости от того, является ли массив пустым в пользовательском 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 голосов
/ 24 января 2019

Возможно, окно 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

Кроме того, если вы можете предоставить дополнительную информацию о сообщении об ошибке из консоли отладки. Тогда я смогу помочь лучше.

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