gpt4 book ai didi

ios - 从 AppDelegate 呈现登录屏幕

转载 作者:行者123 更新时间:2023-12-01 18:10:39 25 4
gpt4 key购买 nike

我需要从我的应用程序中显示一个特定的 ViewController(在 swift 中定义),但它不起作用。这是我正在做的事情:

我在文件 Main.storyboard 的 Storyboard中定义了一个登录屏幕。该 Storyboard有一个 UINavigationController 进入一个带有 Storyboard ID“LoginVC”的屏幕。

当我第一次运行该应用程序时,一切都很好。但是当用户后台应用程序(按下主页按钮)时,我会自动注销用户,这仅意味着在 userDefaults 中将变量“loggedin”设置为 false。

当用户按下应用程序图标以启动/前台应用程序时,它会返回到它在后台运行时所在的屏幕,这对于应用程序来说是非常标准的行为,但这不是我想要的。

在 AppDelegate applicationDidBecomeActive 中,我想检查用户默认值并查看我们是否已登录,如果没有,那么我想显示登录屏幕“LoginVC”。

我的代码如下所示。该代码不会引发任何错误,但它永远不会进入登录屏幕 - 它只是停留在同一个旧屏幕上。我究竟做错了什么?

还要注意 MyLoginVC 是在 swift 中定义的,所以我在 AppDelegate 中导入了 -Swift.h。

再一次,一切都编译了,它看起来应该运行,它认为它已注销并尝试显示登录屏幕,但它只是.doesn't.work。有任何想法吗?

- (void)applicationDidBecomeActive:(UIApplication *)application
{

NSLog(@"applicationDidBecomeActive");

BOOL loggedIn=[self.engine is_logged_in];
if (loggedIn) {
NSLog(@"self.engine says we are logged in");
} else {
NSLog(@"self.engine says we are NOT logged in");
[self showLoginUI];
NSLog(@"Are we at login screen yet?");
}
}

- (void) showLoginUI {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MyLoginVC *loginVC = [storyboard instantiateViewControllerWithIdentifier:@"LoginVC"];
if (loginVC) {
NSLog(@"loginVC is something");
} else {
NSLog(@"loginVC is nil");
}
//
// Neither of these works!
//
//[self.window.rootViewController.navigationController presentViewController:loginVC animated:YES completion:nil];
//[self.window.rootViewController.navigationController pushViewController:loginVC animated:YES];
}

更新:当应用程序重新进入前台并检测到用户现在已注销时,我不敢相信我是第一个需要显示登录 VC 的人。也许我可以提供更多细节。我的 Storyboard是 Main.storyboard,最左边的(初始)VC 是一个普通的旧 UINavigationController。这会自动成为 rootViewController 吗?与 AppDelegate 中的 self.window.rootViewController 相同的 rootViewController 吗?有什么方法可以让应用程序检测到应用程序刚刚重新进入前台并且现在必须显示登录 VC,因为当应用程序进入后台时用户已注销。以前一定有人解决过这个问题。

最佳答案

通过反复试验、耐心和大量搜索,我偶然发现了正确的答案,或者至少是一种可行的方法。这里是:

我的 Storyboard顶部有一个 UINavigationController,然后连接到一个 LoginVC(我不是一个 Storyboard人,而且我没有编写界面代码,所以我怀疑“连接”是错误的词,但你明白了主意)。 UINavigationController 的检查器 IF 为 @"LoginScreen",而 Login VC 的 ID 为 @"LoginVC"。 LoginVC 类已经正确处理了应用程序启动的情况,并正确检查用户是否已经登录,如果用户已经登录,则转换到主应用程序屏幕。我需要处理的情况是用户最小化应用程序(通过按主页按钮)和我重载 AppDelegate applicationDidEnterBackground 以注销用户的位置。

当用户恢复应用程序(通过按下图标)时,应用程序将进入前台并再次变为事件状态。在 applicationDidBecomeActive 中,我检查 userDefaults 以查看用户是否仍然登录。如果用户仍然登录,我不做任何其他事情。如果用户没有登录,我调用我自己的 AppDelegate 函数 showLoginUI 来告诉应用程序切换到登录界面。这是该功能:

-(void) showLoginUI {
self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"LoginScreen"];
}

该函数中的这一行代码是我唯一需要做的事情,它就像一个魅力。看起来它将窗口 rootViewController 设置为新实例化的 UINavigationController,它是 Storyboard 中的根 VC。不知道引擎盖下发生了什么魔法,但它对我有用。

关于ios - 从 AppDelegate 呈现登录屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com