我在 iOS 中有一些问题 swift 核心数据
Posted
技术标签:
【中文标题】我在 iOS 中有一些问题 swift 核心数据【英文标题】:I have some problem swift core data in iOS 【发布时间】:2020-03-31 18:19:58 【问题描述】:我在我的应用程序中使用 Core Data。所以我试试。像这样实现和依赖注入。但我有一些错误。 “线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)”。这是代码和调试器图片。
import UIKit
import CoreData
class NoteDraftViewController: UIViewController
@IBOutlet weak var noteTableView: UITableView!
var managedObjectContext: NSManagedObjectContext!
override func viewDidLoad()
super.viewDidLoad()
noteTableView.dataSource = self
.
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
// Override point for customization after application launch.
//3.5 aris video
//how to context can be created
let mainContext = createMainContext()
let fisrtViewContoller = getFirstViewController()
fisrtViewContoller.managedObjectContext = mainContext
return true
func getFirstViewController() -> NoteDraftViewController
//Get the window's root view controller (which is navigation controller)
let navigationController = window?.rootViewController as! UINavigationController //Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
// Get the navigation controller's first view controller
// Cast it to a ShoutOutDraftsViewController and return
let firstVC = navigationController.viewControllers[0]
return firstVC as! NoteDraftViewController
..........
调试器显示此消息:
【问题讨论】:
我的项目中有 swift 5.0 版本 【参考方案1】:我会如下重写你的函数,移除强制展开:
func getFirstViewController() -> NoteDraftViewController?
if let navigationController = window?.rootViewController as? UINavigationController,
let firstVC = navigationController.viewControllers.first as? NoteDraftViewController
return firstVC
else
return nil
然后在你的AppDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
let mainContext = createMainContext()
if let firstViewContoller = getFirstViewController()
firstViewContoller.managedObjectContext = mainContext
return true
【讨论】:
很高兴为您提供帮助 - 我建议您阅读可选选项以及如何避免将来出现类似问题。【参考方案2】:如果您使用的是 ios 13,则 didFinishLaunchingWithOptions 中的 appDelegate 中的窗口将为零,因此将其移至 SceneDelegate 加上您正在投射的 window.rootViewController 目前为零! UINavigationController 所以它崩溃了你应该首先移动到 sceneDelegate 并插入这个代码
window?.rootViewController = UINavigationController(rootViewController: YourControllerObject)
【讨论】:
我在sceneDelegate中究竟在哪里添加了这段代码“window?.rootViewController = UINavigationController(rootViewController: YourControllerObject)”? 添加到func场景(_场景: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)【参考方案3】:window?.rootViewController
不是UINavigationController
,所以通过强制将其转换为一个,它会崩溃。您需要创建一个带有根视图控制器的导航控制器。试试:
let rootVC = window?.rootViewController
let navigationController = UINavigationController(rootViewController: rootVC)
【讨论】:
我完全错过了错误并且正在查看错误的行。更新了我的答案 我像这样更新了我的代码 let rootVC = (window?.rootViewController)! let navigationController = UINavigationController(rootViewController: rootVC) 但现在我遇到了这个问题,我以前也遇到过。以上是关于我在 iOS 中有一些问题 swift 核心数据的主要内容,如果未能解决你的问题,请参考以下文章
即使应用程序重新打开也保存数据 - Swift Xcode 6 iOS