Как пропустить вход, если пользователь уже вошел в swift - PullRequest
0 голосов
/ 09 июля 2019

enter image description hereenter image description here Чтобы пропустить вход в систему, если пользователь уже вошел в систему, я использую значения по умолчанию пользователя и в делегате приложения я вызываю контроллер домашнего просмотра, но проблема в том, что данныеошибка не появляется как ошибка nil Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value in swreal view controller

здесь мой код

 if UserDefaults.standard.bool(forKey: "login") {
        //YES Already Login

        self.window = UIWindow(frame:UIScreen.main.bounds)
                    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
                    let viewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                    let navigationController = UINavigationController.init(rootViewController: viewController)
                    self.window?.rootViewController = navigationController
                    self.window?.makeKeyAndVisible()
    } else {
        //NOT Login
        self.window = UIWindow(frame:UIScreen.main.bounds)
                    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
                    let viewController = storyboard.instantiateViewController(withIdentifier: "signinpage") as! ViewController
                    let navigationController = UINavigationController.init(rootViewController: viewController)
                    self.window?.rootViewController = navigationController
                    self.window?.makeKeyAndVisible()
    }

и после пропущенного входа в систему значение home nil появляется в этой 3-й строке.self.view ......

super.viewDidLoad()
    menuButton.target = self.revealViewController()
    menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

 @IBAction func logoutButton(_ sender: Any) {


    let alert = UIAlertController(title: "Alert", message: "Are you Sure You want to Logout", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        GIDSignIn.sharedInstance().signOut()
        let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "signinpage") as! ViewController
        UserDefaults.standard.set(false, forKey: "login")
        self.navigationController?.setViewControllers([secondViewController], animated: true)
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler:nil))
    self.present(alert, animated: true, completion: nil)



}

Ответы [ 5 ]

0 голосов
/ 12 июля 2019

Вы можете использовать концепцию нескольких раскадровок.

  1. Вход в раскадровку
  2. Домашняя раскадровка

    +(void) LoginHomeScreen:(NSString*)strController andIndex:(int)index 
    { 
         NSData *data = [[NSUserDefaults standardUserDefaults] dataForKey:USERDETAILS];
    
         NSDictionary *userData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    
         if (userData != NULL && [userData count] > 0) {
             //DashboardVC
             UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Home" bundle:nil];
             UINavigationController *navigationController = [storyboard instantiateViewControllerWithIdentifier:@"SideMenuNavigationVC"];
             [navigationController setViewControllers:@[[storyboard instantiateViewControllerWithIdentifier:strController]]];
    
             LGSideMenuController *mainViewController = [storyboard instantiateInitialViewController];
             mainViewController.rootViewController = navigationController;
    
             UIViewController * SideMenu = [storyboard instantiateViewControllerWithIdentifier:@"SideMenuVC"];
             mainViewController.leftViewController = SideMenu;
             mainViewController.leftViewPresentationStyle = LGSideMenuPresentationStyleSlideBelow;
    
             UIWindow *window = UIApplication.sharedApplication.delegate.window;
             window.rootViewController = mainViewController;
    
             [UIView transitionWithView:window duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];
    
         } else {
             UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
             LoginVC *loginVC = (LoginVC *)[storyboard instantiateViewControllerWithIdentifier:@"LoginVC"];
             UINavigationController *navLogin = [[UINavigationController alloc] initWithRootViewController:loginVC];
             navLogin.navigationBar.hidden = true;
             [[UIApplication sharedApplication].delegate.window setRootViewController:navLogin];
         }
    }
    
0 голосов
/ 09 июля 2019

измените этот код

self.window = UIWindow(frame:UIScreen.main.bounds)
                let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
                let viewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                let navigationController = UINavigationController.init(rootViewController: viewController)
                self.window?.rootViewController = navigationController
                self.window?.makeKeyAndVisible()

на этот:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "SWRevealViewController")
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()

предполагает, что у вас есть навигационный контроллер типа SWRevealViewController с segues sw_front на ваш HomeViewController или NavigationController перед ним и sw_rear в вашем меню VC.так что вы должны создать экземпляр SWRevealViewController, чтобы отобразить меню, в вашем коде ваш goint направлен на домашний экран, поэтому SWRevealViewController равен нулю, поскольку не был создан до HomeViewController.

PD: здесьпример того, как я делаю в проекте, и работает с полем с вышеуказанным кодом enter image description here и задает его в инспекторе идентичности enter image description here

0 голосов
/ 09 июля 2019
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     // Override point for customization after application launch.

     //Check that user login or not        
     if let isLogin = UserDefaults.standard.object(forKey: "login") as? Bool {

        //If already login then show Dashboard screen    
        self.showDashboardScreen()
     } else {

        //If not login then show Login screen
        self.showLoginScreen()
     }

     return true 
}

func showLoginScreen() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginViewController: LoginViewController = storyboard.instantiateViewController(withIdentifier: "#LoginViewControllerStoryboardID") as! LoginViewController

     var navigationController = UINavigationController()
     navigationController = UINavigationController(rootViewController: loginViewController)

     //It removes all view controllers from the navigation controller then sets the new root view controller and it pops.
     window?.rootViewController = navigationController

     //Navigation bar is hidden
     navigationController.isNavigationBarHidden = true 
}

func showDashboardScreen() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let dashboardViewController: DashboardViewController = storyboard.instantiateViewController(withIdentifier: "#DashboardViewControllerStoryboardID") as! DashboardViewController

     var navigationController = UINavigationController()
navigationController = UINavigationController(rootViewController: dashboardViewController)

     //It removes all view controllers from the navigation controller then sets the new root view controller and it pops.
     window?.rootViewController = navigationController

     //Navigation bar is hidden
     navigationController.isNavigationBarHidden = true 
 }
0 голосов
/ 09 июля 2019

По моим наблюдениям, self.revealViewController() - ноль. Чтобы убедиться, что это ноль, добавьте точку останова в 3-й строке и напечатайте self.revealViewController () в консоли, выполнив

po self.revealViewController()

если это ноль, Ссылки ниже:

Self.revealViewController () возвращает ноль

https://github.com/John-Lluch/SWRevealViewController/issues/627

https://www.codebeaulieu.com/programming/2017/5/5/a-cleaner-swrevealviewcontroller-implementation-using-swift-extensions

Также покажите код, который вы использовали для настройки SWRevealcontroller.

0 голосов
/ 09 июля 2019

Сначала проверьте ваш идентификатор раскадровки , это правильно или нет.И вы можете проверить ниже код для получения дополнительной информации.Надеюсь, что это может помочь решить вашу проблему.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if UserDefaults.standard.object(forKey: "login") != nil {
                    let storyboard = UIStoryboard(name: "Main", bundle: nil)
                    let viewController: HomeViewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                    let mainViewController = storyboard.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
                    let navigationController = storyboard.instantiateViewController(withIdentifier: "NavigationController") as! NavigationController
                    navigationController.setViewControllers([viewController], animated: false)
                    mainViewController.rootViewController = navigationController
                    let window = UIApplication.shared.delegate!.window!
                    window!.rootViewController = mainViewController
                    UIView.transition(with: window!, duration: 0.3, options: [.transitionCrossDissolve], animations: nil, completion: nil)
                }
        }
...