2

我正在创建一个 iOS 应用程序,其中我有以下要求:应用程序应在第一次启动时显示登录屏幕,并且当应用程序从后台到前台时也必须显示该屏幕,以防万一在运行时被发送到后台。

在这两种情况下,我都处理了显示屏幕。但是,当我这样做并且应用程序来自后台时,我单击 texfield 输入我的密码,应用程序被冻结,并且它在一个我不知道它意味着什么的线程中失败。

当应用程序来自这样的背景时,我调用要显示的屏幕,在应用程序WillEnterForeground 中,在 AppDelegate 中:

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[[self window] setRootViewController:room];
[self.window makeKeyAndVisible];

这是正确的方法吗?

非常感谢提前!我完全迷失了这一点,因为我在 iOS 中很新,所以任何帮助都将不胜感激。

附加在图像中,您可以看到应用程序失败的位置。应用失败的线程截图

为解释线程问题所做的跟踪截图

4

2 回答 2

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

并轻松返回到应用程序的其余部分。

于 2013-07-10T03:52:14.280 回答
0

如果你使用这行代码会很乱

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

这意味着每次您创建新实例时UIWindow都将包含UIViewController所有其他组件。这意味着当您进入后台并进入前台时,旧窗口实例已被清除,它将包含新组件,这就是为什么当您单击 UITextField 时它已被释放,您收到错误的原因。不要创建 window 的新实例并像@PartiallyFinite那样使用代码。

希望这可以帮助。

于 2013-07-10T05:33:56.810 回答