如何从iOS中的AppDelegate调用视图控制器

时间:2013-07-10 02:35:16

标签: ios xcode viewcontroller appdelegate

我正在创建一个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中非常新,所以任何帮助都将非常感激。

附在图片中,您可以看到应用失败的位置。 Screenshot of the thread where the app fails

Screenshot of the tracking made to interpret the thread issue

2 个答案:

答案 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 的代码。

希望这有帮助。