У меня есть проблемы с быстродействующими данными в iOS - PullRequest
0 голосов
/ 31 марта 2020

Я использую базовые данные в своем приложении. поэтому я стараюсь. реализовать и внедрение зависимости, как это. но у меня есть ошибка Msgstr "Поток 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
    }..........

Отладчик показывает это сообщение: enter image description here

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

если вы используете iOS 13, окно будет равно нулю в appDelegate в didFinishLaunchingWithOptions , поэтому переместите его в SceneDelegate плюс ваш кастинг window.rootViewController, который в настоящее время равен нулю! UINavigationController, чтобы он вылетал, сначала перейдите на sceneDelegate и вставьте этот код

window?.rootViewController = UINavigationController(rootViewController: YourControllerObject)
0 голосов
/ 31 марта 2020

Я бы переписал вашу функцию следующим образом, убрав принудительное развертывание:

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
}
0 голосов
/ 31 марта 2020

window?.rootViewController - это не UINavigationController, поэтому при принудительном приведении к одному оно падает. Вам необходимо создать контроллер навигации с контроллером вида root. попробуй:

let rootVC = window?.rootViewController
let navigationController = UINavigationController(rootViewController: rootVC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...