如何在 iOS 中从 AppDelegate 调用视图控制器
Posted
技术标签:
【中文标题】如何在 iOS 中从 AppDelegate 调用视图控制器【英文标题】:How to call a view controller from AppDelegate in iOS 【发布时间】:2013-07-10 02:35:15 【问题描述】:我正在创建一个 ios 应用程序,其中我有以下要求:该应用程序应在第一次启动时显示登录屏幕,并且当应用程序从后台到前台时也必须显示该屏幕,在如果它在运行时被发送到后台。
我已经在这两种情况下都显示了屏幕。但是,当我这样做并且应用程序来自后台时,我单击 texfield 输入我的密码,应用程序被冻结,并且它在一个我不知道它意味着什么的线程中失败。
当应用程序来自这样的背景时,我调用要显示的屏幕,在 applicationWillEnterForeground 中,在 AppDelegate 中:
self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[[self window] setRootViewController:room];
[self.window makeKeyAndVisible];
这是正确的做法吗?
提前非常感谢!我完全迷失了,因为我是 iOS 的新手,所以非常感谢任何帮助。
附在一张图片中,您可以看到应用失败的地方。
【问题讨论】:
在这种情况下,我要做的是在您的应用程序委托中使用导航控制器的实例,并以模态方式显示您的登录控制器。如果您不使用导航控制器层次结构,我会推荐它,但另一种选择是将您的登录视图控制器视图添加为您的 uiwindow 的子视图。我认为您的问题可能与创建应用程序 uiwindow 的新实例有关。创建应用程序委托窗口后,您永远不必释放它。 【参考方案1】:您当前使用的代码正在完全删除应用窗口的根视图控制器,换句话说,您正在删除应用中的所有视图和视图控制器。如果您不使用 ARC,这只是一个巨大的内存泄漏。如果你是,这仍然不是一个好主意。
在您的 applicationWillEnterForeground:
方法中,尝试改用此代码:
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[self.window.rootViewController presentViewController:room
animated:NO
completion:nil];
这将在您应用的所有当前视图顶部显示RoomRootViewController
,而不是删除它们。然后你可以像这样关闭它:
[self.window.rootViewController dismissViewControllerAnimated:YES
completion:nil];
并轻松返回应用的其余部分。
【讨论】:
它就像一个魅力!非常感谢 !你不知道我有多感激。你摇滚!【参考方案2】:如果用这行代码会很乱
self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
这意味着每次您创建 UIWindow
的新实例时,每次都会包含 UIViewController
和所有其他组件。这意味着当您进入后台并进入前台时,旧窗口实例已被清除,它将包含新组件,这就是为什么当您单击 UITextField 时它已被释放,您收到错误的原因。不要像 @PartiallyFinite 那样创建新的 window 实例并使用代码。
希望这会有所帮助。
【讨论】:
以上是关于如何在 iOS 中从 AppDelegate 调用视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
在 Core Data 中从 AppDelegate 执行回滚功能时需要访问 ManagedObjectContext 的同一实例
iOS:如何在 AppDelegate 之外调用“应用程序 didRegisterForRemoteNotificationsWithDeviceToken”?
来自 appDelegate 的 javascript 调用:phonegap iOS