Ios 设置根视图控制器不起作用?

Ios 设置根视图控制器不起作用?,ios,objective-c,uinavigationcontroller,pushviewcontroller,rootviewcontroller,Ios,Objective C,Uinavigationcontroller,Pushviewcontroller,Rootviewcontroller,我的代码是 #import "AppDelegate" 在viewDidLoad中 self.delegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 得到回复后 //If server response is success make HomeViewController as Root VC if ([[[_response objectForKey:@"Response"] objectForKey

我的代码是

#import "AppDelegate"
在viewDidLoad中

self.delegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
得到回复后

//If server response is success make HomeViewController as Root VC
if ([[[_response objectForKey:@"Response"] objectForKey:@"status"]  isEqualToString:@"SUCCESS"]) {

dispatch_async(dispatch_get_main_queue(), ^{

//Make root view controller
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //My storyboard name is Main.storyboard
HomeViewController * hvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"HVC"];
self.delegate.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:hvc];
[self.delegate.window makeKeyAndVisible];

});
} 

但是它不起作用了…

SWIFT代码 在Appdelegate类中实现如下两个方法:-

    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?

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

            application.statusBarStyle = .lightContent
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.makeKeyAndVisible()

            return true
        }
        func showTabBar()  {

            let tabBarContoller = UIStoryboard(name: OTPStoryBoards.Booking, bundle: nil).instantiateViewController(withIdentifier: OTPViewControllers.TabBarController) as! UITabBarController
            self.window?.rootViewController = tabBarContoller
        }

        func showLogin()  {
            let loginVC = UIStoryboard(name: OTPStoryBoards.Authentication, bundle: nil).instantiateViewController(withIdentifier: OTPViewControllers.LoginVC) as! OTPLoginViewController
            let navigationControler = UINavigationController(rootViewController: loginVC)
            self.window?.rootViewController = navigationControler
        }
}
无论何时,只要您想更改根目录,都可以调用这些方法

let APP_DELEGATE    = UIApplication.shared.delegate as! AppDelegate

  APP_DELEGATE.showLogin() or APP_DELEGATE.showTabBar() 

SWIFT代码 在Appdelegate类中实现如下两个方法:-

    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?

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

            application.statusBarStyle = .lightContent
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.makeKeyAndVisible()

            return true
        }
        func showTabBar()  {

            let tabBarContoller = UIStoryboard(name: OTPStoryBoards.Booking, bundle: nil).instantiateViewController(withIdentifier: OTPViewControllers.TabBarController) as! UITabBarController
            self.window?.rootViewController = tabBarContoller
        }

        func showLogin()  {
            let loginVC = UIStoryboard(name: OTPStoryBoards.Authentication, bundle: nil).instantiateViewController(withIdentifier: OTPViewControllers.LoginVC) as! OTPLoginViewController
            let navigationControler = UINavigationController(rootViewController: loginVC)
            self.window?.rootViewController = navigationControler
        }
}
无论何时,只要您想更改根目录,都可以调用这些方法

let APP_DELEGATE    = UIApplication.shared.delegate as! AppDelegate

  APP_DELEGATE.showLogin() or APP_DELEGATE.showTabBar() 

LoginViewController
中,您需要跟踪用户成功登录的用户登录状态。为此,您可以将
bool
var存储在UserDefaults中,如

UserDefaults.standard.setValue(true, forKey: "isUserLoggedIn")
UserDefaults.standard.synchronize()
所以,当任何一个应用程序被重新启动时,你需要检查用户是否已经登录…并根据这一点,你可以显示所需的屏幕

if let isLoggedIn = UserDefaults.standard.value(forKey: "isUserLoggedIn") as? Bool, isLoggedIn == true {

   //Make root view controller
   UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
   HomeViewController * hvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"HVC"];
   self.delegate.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:hvc];

} else {
    //show login view controller as user is not yet logged in
}

LoginViewController
中,您需要跟踪用户成功登录的用户登录状态。为此,您可以将
bool
var存储在UserDefaults中,如

UserDefaults.standard.setValue(true, forKey: "isUserLoggedIn")
UserDefaults.standard.synchronize()
所以,当任何一个应用程序被重新启动时,你需要检查用户是否已经登录…并根据这一点,你可以显示所需的屏幕

if let isLoggedIn = UserDefaults.standard.value(forKey: "isUserLoggedIn") as? Bool, isLoggedIn == true {

   //Make root view controller
   UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
   HomeViewController * hvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"HVC"];
   self.delegate.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:hvc];

} else {
    //show login view controller as user is not yet logged in
}

您试图实现的是自动登录功能(如果用户已经登录,则无需登录页面)。 您所做的是正确的,但您也需要从
AppDelegate
管理这件事。
设置根视图控制器后,需要在代码中添加一行

        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isUserLoggedIn"]; 
        // PUT this line after  [self.delegate.window makeKeyAndVisible];
您可以在AppDelegate中创建方法,该方法从UserDefault监视布尔变量。然后导航到vc1->vc2

将其放入Appdelegate中,并从
didFinishLuanchWithOptions

- (void) checkLoginStatusAndProceed {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isUserLoggedIn"] && [[NSUserDefaults standardUserDefaults] boolForKey:@"isUserLoggedIn"] == YES) {
        // Navigate to HomeViewController
        //Make root view controller
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //My storyboard name is Main.storyboard
        HomeViewController * hvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"HVC"];
        self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:hvc];
       [self.window makeKeyAndVisible];
    }

}

您试图实现的是自动登录功能(如果用户已经登录,则无需登录页面)。 您所做的是正确的,但您也需要从
AppDelegate
管理这件事。
设置根视图控制器后,需要在代码中添加一行

        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isUserLoggedIn"]; 
        // PUT this line after  [self.delegate.window makeKeyAndVisible];
您可以在AppDelegate中创建方法,该方法从UserDefault监视布尔变量。然后导航到vc1->vc2

将其放入Appdelegate中,并从
didFinishLuanchWithOptions

- (void) checkLoginStatusAndProceed {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isUserLoggedIn"] && [[NSUserDefaults standardUserDefaults] boolForKey:@"isUserLoggedIn"] == YES) {
        // Navigate to HomeViewController
        //Make root view controller
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //My storyboard name is Main.storyboard
        HomeViewController * hvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"HVC"];
        self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:hvc];
       [self.window makeKeyAndVisible];
    }

}

根据您的要求,您需要在
UserDefaults
中维护一个标志

注意:这只是伪代码,因为我没有带着笔记本电脑坐在办公桌上

遵循如下步骤:

  • 创建用户默认对象和保存标志,例如
    isFirstLaunch=false
  • 将HomeVC设置为root之后,将此标志更改为true
  • 在AppDelegate In
    didFinishLaunchingWithOptions
    中,再次检查此标志,如下所示

    if UserDefaults.standard.bool(用于:“isFirstLaunch”){ //显示登录 }否则{ //带回家 }


  • 根据您的要求,您需要在
    UserDefaults
    中维护一个标志

    注意:这只是伪代码,因为我没有带着笔记本电脑坐在办公桌上

    遵循如下步骤:

  • 创建用户默认对象和保存标志,例如
    isFirstLaunch=false
  • 将HomeVC设置为root之后,将此标志更改为true
  • 在AppDelegate In
    didFinishLaunchingWithOptions
    中,再次检查此标志,如下所示

    if UserDefaults.standard.bool(用于:“isFirstLaunch”){ //显示登录 }否则{ //带回家 }



  • 你不工作是什么意思?您得到的输出是什么?什么对您不起作用,你确定你的所有标识符都是正确的吗?我想把我的主页设置为根VC。当我重新打开我的应用程序时,它的登录页面不是主页page@PrashantTukadiya是的,所有id都是正确的,它正在成功地从登录页面移动到主页。重新打开我的应用程序后,其打开的agin登录页不是主页,但我的主页是rootpage@Marking,一旦您登录。将布尔变量设置为UserDefault。现在在appDelegate中检查bool变量是否为nil和true,然后直接从那里设置HomeViewController。无需转到登录视图控制器不工作是什么意思?您得到的输出是什么?什么对您不起作用,你确定你的所有标识符都是正确的吗?我想把我的主页设置为根VC。当我重新打开我的应用程序时,它的登录页面不是主页page@PrashantTukadiya是的,所有id都是正确的,它正在成功地从登录页面移动到主页。重新打开我的应用程序后,其打开的agin登录页不是主页,但我的主页是rootpage@Marking,一旦您登录。将布尔变量设置为UserDefault。现在在appDelegate中检查bool变量是否为nil和true,然后直接从那里设置HomeViewController。无需转到“登录视图控制器”不在应用程序中委派,我想要从vc1到vc1,这意味着从页面登录到主页。@标记您可以从您想要的任何视图控制器调用该方法。我已经更新了答案,请不要在应用程序中签委托,我要从vc1到vc1,这意味着登录到主页。@标记您可以从您想要的任何视图控制器调用该方法。我已经更新了答案,请查看@Prashant Tukadiya我想这会对我有所帮助,请稍候,我将更新我的code@Marking很高兴提供帮助:)@Prashant Tukadiya谢谢您不应该将您的方法命名为checkUserAlreadyLoggedIn,因为它不检查用户是否登录。我建议使用“CheckLoginStatus and Procedue”或类似的名称。@VishalSonawane感谢您的反馈,但它会检查用户登录来自userdefault@Prashant Tukadiya的
    isUserLoggedIn
    状态我想这会对我有所帮助,请稍候,我将更新我的code@Marking很高兴提供帮助:)@Prashant Tukadiya谢谢您不应该将您的方法命名为checkUserAlreadyLoggedIn,因为它不检查用户是否登录。我建议使用“CheckLoginStatus and Procedue”或类似的名称。@VishalSonawane感谢您的反馈,但它会检查用户登录按<化学需氧量>分类的状态