Estoy usando Firebase para mi aplicación y quiero presentar diferentes controladores de vista en AppDelegate con el código a continuación, pero sigo recibiendo un error.

import UIKit
import Firebase
import FirebaseAuth

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow()
        if Auth.auth().currentUser != nil {
            window?.rootViewController = HomeController()
        } else {
            window?.rootViewController = LoginController()
        }

    return true

    }

    ...

Este es el error.

libc ++ abi.dylib: termina con una excepción no detectada del tipo NSException (lldb)

¿Cómo puedo solucionar este problema?

0
coonie 7 mar. 2018 a las 06:41

3 respuestas

La mejor respuesta

En primer lugar, debe saber que necesita una referencia a la instancia ya creada en lugar de crear una nueva. Puede haber dos casos

Caso 1. Si desea cambiar el controlador de vista inicial en la comprobación de si Auth.auth (). CurrentUser == nil o iAuth.auth (). CurrentUser! = Nil, simplemente puede escribir el código en didFinishLaunchingWithOptions en AppDelegate y asegúrese de dar el identificador en el guión gráfico y usar el mismo identificador en el código

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

   let mainView = UIStoryboard(name: "MainStoryboard", bundle: nil)

    if Auth.auth().currentUser != nil {
       let viewcontroller :  MainViewController = mainView.instantiateViewController(withIdentifier: "MainViewIdentifier") as! MainViewController
       self.window!.rootViewController = viewcontroller
       self.window?.makeKeyAndVisible();
    } else {
       let viewcontroller :  LoginViewController = mainView.instantiateViewController(withIdentifier: "loginViewIdentifier") as! LoginViewController
       self.window!.rootViewController = viewcontroller
       self.window?.makeKeyAndVisible();
    }

return true

}

Caso 2. Suponga que tiene Main / Home / Dash VC (controlador de vista) y siempre es el controlador de vista inicial, entonces allí ha implementado la verificación if Auth.auth (). CurrentUser == nil luego presente / presione el controlador de vista de inicio de sesión o no.

1
Karamjeet Singh 7 mar. 2018 a las 05:12

Estás creando directamente una nueva instancia de ViewController Prueba el siguiente código

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {


        if Auth.auth().currentUser != nil {
            var mainView: UIStoryboard!
        mainView = UIStoryboard(name: "MainStoryboard", bundle: nil)
        let viewcontroller :  HomeController = mainView.instantiateViewController(withIdentifier: "someViewController") as! HomeController
        self.window!.rootViewController = viewcontroller
        self.window?.makeKeyAndVisible();
        } else {
                     var mainView: UIStoryboard!
        mainView = UIStoryboard(name: "MainStoryboard", bundle: nil)
         let viewcontroller :  LoginController = mainView.instantiateViewController(withIdentifier: "loginVCIdentifier") as! LoginController
        self.window!.rootViewController = viewcontroller
        self.window?.makeKeyAndVisible();
        }

    return true

    }

Asegúrese de haber dado el identificador al controlador desde el guión gráfico

1
Jaydeep Vyas 7 mar. 2018 a las 03:55

Swift 4.0

Puede usar esta función como se muestra a continuación en AppDelegate.

func configureWindowAndMakeVisible(rootVC: UIViewController) {
        if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
            window.rootViewController = rootVC
            window.makeKeyAndVisible()
      }
  }

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        if Auth.auth().currentUser != nil {
            // Use initialization (i.e HomeController()) only if you had initialize view in Controller
            configureWindowAndMakeVisible(rootVC: HomeController()) 
        } else {
            configureWindowAndMakeVisible(rootVC: LoginController()) 
        }

    return true
  }
2
Jaydeep 7 mar. 2018 a las 04:13