我在 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 核心数据问题

Swift 3 / iOS 10,正确使用核心数据

即使应用程序重新打开也保存数据 - Swift Xcode 6 iOS

在swift ios中再次运行应用程序后核心数据显示故障记录?

在 Swift 中过滤对象数组并求和它们的属性

需要帮助在 Swift 的 UITableView 中显示核心数据