- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个基本情况,当用户通过身份验证后,我删除当前屏幕(登录屏幕)并将其更改为应用程序内的另一个屏幕。
为此,我使用以下代码:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
print("Window's subviews before removed = \(appDelegate.window?.subviews)")
appDelegate.window?.subviews.forEach { $0.removeFromSuperview() }
print("Window's subviews after removed = \(appDelegate.window?.subviews)")
appDelegate.window?.rootViewController?.view?.removeFromSuperview()
appDelegate.window?.rootViewController?.removeFromParentViewController()
appDelegate.window?.rootViewController = newRootViewController
print("Window's subviews after changed = \(appDelegate.window?.subviews)")
}
这是输出:
但是,在 Debug View Hierarchy 工具中却不行:
如您所见,旧 rootViewController 的 View 仍然存在于 UIWindow
中,但不是它的 subview - 正如输出所示。
这个行为看起来很奇怪,有没有人遇到过这个问题?
最佳答案
我在使用 Google 登录 SDK 和 Facebook 登录 SDK 登录时尝试替换 rootViewController
时遇到了这个问题。
这些 SDK 有一个像这样的身份验证屏幕:
通过使用 Debug View Hierarchy,我意识到当显示身份验证屏幕 (2) 时,应用将 rootViewController
更改为 UITransitionView
。当身份验证屏幕消失 (3) 时,它再次将 rootViewController
更改为显示身份验证屏幕 (1) 之前的状态。
状态(1):在呈现身份验证屏幕之前,rootViewController
是LoginViewController
。
状态(2):呈现认证画面,rootViewController
变为UITransitionView
。
状态(3):关闭身份验证屏幕后,rootViewController
已返回到 LoginViewController
。
我将更改rootViewController
的代码放在相应SDK的每个委托(delegate)方法中,当身份验证完成时调用。
Google 登录 SDK:signIn:didSignInForUser:withError:
Facebook 登录 SDK:logInWithReadPermissions:fromViewController:handler:
这些方法在用户通过身份验证后立即调用,而不管身份验证屏幕是否被关闭。
这意味着,有时,当用户的身份验证过程完成得太快时,甚至在身份验证屏幕关闭并且 rootViewController
更改为 LoginViewController
之前,就会出现问题。这意味着,当用户已通过身份验证但 rootViewController
仍然是 UITransitionView
时,问题出现在两种状态 (2) 和 (3) 之间。
暂时,在我找到更好的解决方案之前,我防止用户的身份验证过程发生得太快,这意味着我等待状态 (3) 在 delaying 之前完成用户通过身份验证并更改 rootViewController
后 0.25 秒。
0.25 的时间足以让一切正常工作,但太快了用户会失去耐心。
关于ios - 更改了 rootViewController 但旧 rootViewController 的 View 仍在 View 层次结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289680/
如果这个问题揭示了我知识中的大漏洞,我深表歉意。 我正在使用 setRootViewController 来切换 View ,因为我需要使用 SplitViewController。当我使用 setR
我有一个基本情况,当用户通过身份验证后,我删除当前屏幕(登录屏幕)并将其更改为应用程序内的另一个屏幕。 为此,我使用以下代码: if let appDelegate = UIApplication.s
我一直在做一个 Swift 项目,我有两个 View Controller ,登录 View Controller 和主页 View Controller 。当用户启动应用程序时,如果用户未登录,我想
我已经使用 SceneDelegate 在登录操作后更改 rootviewcontroller。它工作正常,但当我注销时,我无法再次执行导航。 这是我的 Scenekit 代码: let statu
我有一个应用程序,如果它在后台运行时间过长,我会在其中重新启动该应用程序。当用户在分配的时间后打开应用程序时,会发生重新初始化,并在获取所需数据时显示启动屏幕。当我从服务器获取数据时,我设置了 win
使用以下代码,我可以更改模态视图后面的rootViewController: let storyboard : UIStoryboard = UIStoryboard(name: "Main", bu
当应用程序被激活时,我正在创建一个文件。根据该文件的存在,加载不同的 View 。 我正在尝试的是 - (BOOL)application:(UIApplication *)application d
我正在开发一些自定义相机应用程序,我只想跳过我的登录页面并在用户已经注册时将我的相机主页设置为初始 Root View 。我是从 AppDelegate 或 View 代码内部执行此操作,但是我收到一
我是 iOS - Objective C 的新手,我正在尝试实现登录功能。我的 Storyboard 图如下所示: 因此,当有人单击帐户选项时,它会进入配置文件 View Controller ,并在
我的 iOS 应用程序在后台保持较长时间后会返回到 rootViewController。为了证明我有下面的图片 我一直导航到 ViewControllerC 并将应用程序保持在后台,当我返回应用程序
我有以下 Objective-C 代码来使用主屏幕快速操作启动我的应用程序: - (void)applyShortcutItem:(UIApplicationShortcutItem *)shortc
我正在构建一个在应用加载时执行大量设置的应用。因此,我有一个加载 View ,可以在设置发生时向用户显示一些信息... MyLoadingViewController *loadingViewCont
我想动态更改 rootViewController。这取决于 json 响应。我有一个 BOOL 值,它在收到 json 响应后发生变化。问题是即使条件为真,这个值也永远不会改变。 我的代码在下面,我
我想通过编码来制作导航 Controller 但是有一个问题:下面是我的代码 这是 Appdelegates.m #import "AppDelegate.h" #import "ViewContro
我的情况和this question很相似.我有一个通用的应用程序,其中 iPhone 为纵向,iPad 为横向,我使用 appDelegate.window.rootViewController =
我有一个 RegistrationViewController 和一个 LoginViewController: LoginViewController 是我的 InitialViewControll
有什么方法可以快速进入rootViewController?我想从堆栈中删除所有 View 并返回到 rootViewController,甚至不打扰它上面的 View 序列。 最佳答案 来自文档:
@IBAction func addButton(sender: AnyObject) { let alert = UIAlertController(title: "New Exercise
我想知道是否有人可以帮助我解决下面代码中的内存管理问题。我对 rootController 特别感兴趣,它是在我执行 initWithRootViewController 时被保留还是在窗口 addS
我的 iOS 应用打开时出现登录提示。一旦用户登录,它就会切换到主视图。 在 application:didFinishLaunchingWithOptions 中,我将 RootViewContro
我是一名优秀的程序员,十分优秀!