我正在创建一个iOS应用程序,其中我有以下要求:应用程序应该在第一次启动时显示登录屏幕,并且当应用程序从背景到前台时,也必须显示该屏幕,在运行时它已被发送到后台的情况。
我已经处理过两种情况下的屏幕显示。但是,当我这样做并且应用程序来自后台时,我单击texfield键入我的密码,应用程序被冻结,并且它在一个我不知道它意味着什么的线程中失败。
当应用程序来自这样的背景时,我在appDelegate中的applicationWillEnterForeground中调用屏幕显示:
self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[[self window] setRootViewController:room];
[self.window makeKeyAndVisible];
这是正确的方法吗?
提前多多感谢!我完全迷失了,因为我在iOS中非常新,所以任何帮助都将非常感激。
附在图片中,您可以看到应用失败的位置。
答案 0 :(得分:8)
您当前使用的代码是完全删除应用窗口的根视图控制器,换句话说,您正在删除应用中的所有视图和视图控制器。如果你不使用ARC,这只是一个巨大的内存泄漏。如果你是,那它仍然不是一个好主意。
在applicationWillEnterForeground:
方法中,请尝试使用此代码:
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[self.window.rootViewController presentViewController:room
animated:NO
completion:nil];
这会在您应用的所有当前视图的顶部上显示RoomRootViewController
,而不是删除它们。然后你可以这样解雇它:
[self.window.rootViewController dismissViewControllerAnimated:YES
completion:nil];
并轻松返回到应用的其余部分。
答案 1 :(得分:0)
如果您使用这行代码
,那将非常混乱self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
这意味着每次创建UIWindow
的新实例时,每次都会包含UIViewController
和所有其他组件。这意味着当你转到后台并进入前台时,旧的窗口实例已被刷新,它将包含新的组件,这就是为什么当你点击UITextField它已被解除分配时,你得到错误的原因。不要创建新的窗口实例并使用@ PartiallyFinite 的代码。
希望这有帮助。