swift - 尝试劫持根视图控制器时收到 SIGABRT 错误
问题描述
我试图让我的应用程序根据用户的 NSUserDefaults 中的数组是否为空来打开不同的视图控制器。本质上,如果用户之前在应用程序中保存了数据,应用程序将打开到他们可以选择数据的位置。否则,应用程序将打开欢迎屏幕。
但是,当数组为空时,我会看到我为欢迎屏幕设置的背景颜色,而不是我在情节提要中布置的文本或按钮。当数组不为空并且数据页面应该打开时,我的应用程序会因 SIGABRT 错误而崩溃。我检查了有问题的视图控制器的所有插座,似乎没有任何东西断开连接。此外,当我注释掉应用程序委托中的代码并将数据视图控制器设置为我的初始启动视图时,应用程序运行良好。
完整的错误是“线程 1:信号 SIGABRT”,它在类 AppDelegate 行中被标记。
我在 App Delegate 中使用的代码如下:
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]
}
解决方案
也许 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
此外,如果您可以从调试控制台提供有关错误消息的更多信息。然后我就能以更好的方式提供帮助。
推荐阅读
- jupyter-notebook - 用于 Jupyter 笔记本/实验室(如 Colab)的 Vim 绑定
- javascript - 可以从服务器端管理客户端事件吗?
- apache-kafka - 如何在kafka流中动态处理并发送到不同的主题
- validation - Ghostscript 作为 PDF 验证器:命令和结果
- java - 为什么这个递归循环等于 200?
- r - 如何计算 XML 文件中的数字(字符串格式)
- java - 如何为具有 yolo 输出层的多任务学习网络准备数据集?
- mysql - St_within 用于获取 10 英里半径的 MBR mysql
- php - 如何根据php中列的最大值从数组对象中获取数组对象
- sql-server - 在 SQL Server 中进行正向还原是否安全?