【问题标题】:I have some problem swift core data in iOS我在 iOS 中有一些问题 swift 核心数据
【发布时间】: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 版本

标签: ios swift core-data


【解决方案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) 但现在我遇到了这个问题,我以前也遇到过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多