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

Posted

技术标签:

【中文标题】设置根视图控制器不起作用?【英文标题】:Setting root view controller is not working? 【发布时间】:2018-02-19 08:51:10 【问题描述】:

我的代码是

#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];

);
 

但它不起作用......

【问题讨论】:

不工作是什么意思?你得到的输出是什么? 什么对你不起作用? , 你确定你所有的标识符都是正确的吗? 我想设置我的主页是root VC。当我重新打开我的应用程序时,它得到的是登录页面而不是主页 @Prashant Tukadiya 是的,所有 id 都是正确的,它正在从登录页面成功移动到主页。重新打开我的应用程序后,它的打开登录页面不是主页,但我的主页是根页面 @Marking ,登录后。将布尔变量设置为 UserDefault。现在在 appDelegate 检查 bool 变量是否不是 nil 和 true 然后直接从那里设置 HomeViewController。无需登录视图控制器 【参考方案1】:

您尝试实现的是自动登录功能(如果用户已经登录,则不需要登录页面)。 你所做的是正确的,但你也需要从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];
    


【讨论】:

@Prashant Tukadiya 我认为这对我有帮助,请稍候,我会更新我的代码 @Marking 乐于助人 :) @Prashant Tukadiya 谢谢 您不应该将您的方法命名为 checkUserAlreadyLoggedIn,因为它不会检查用户是否已登录。我建议使用 'checkLoginStatusAndProceed' 或类似的东西。 @VishalSonawane 感谢您的反馈,但它确实通过isUserLoggedIn from userdefault检查用户登录状态【参考方案2】:

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
        

每当你想改变 root 调用这些方法

let APP_DELEGATE    = UIApplication.shared.delegate as! AppDelegate

  APP_DELEGATE.showLogin() or APP_DELEGATE.showTabBar() 

【讨论】:

不在app delegate中,我要从vc1到vc1,表示登录页面到首页。 @Marking 您可以从您想要的任何视图控制器调用该方法。我有更新的答案请检查【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

注意:这只是伪代码,因为我不在办公桌前拿着笔记本电脑

按照以下步骤操作:

    创建用户默认对象并保存标志例如isFirstLaunch = false 将 HomeVC 设置为 root 后,将此标志更改为 true。

    didFinishLaunchingWithOptions 的 AppDelegate 中,再次检查此标志,如

    如果 UserDefaults.standard.bool(for:"isFirstLaunch") //显示登录 别的 //显示首页

【讨论】:

以上是关于设置根视图控制器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置 rootViewController 不起作用,仅在 Xcode 11 中从情节提要中选择初始视图控制器

在容器视图中导航时,Unwind Segue 不起作用

在 ViewDidAppear 上更改核心动画持续时间似乎不起作用

UINavigationController pushViewController 不起作用

设置每个视图的标题不起作用

Unwind segue 不起作用 SWIFT