在后台启动应用程序时如何避免加载视图控制器/视图?
Posted
技术标签:
【中文标题】在后台启动应用程序时如何避免加载视图控制器/视图?【英文标题】:How to avoid loading viewControllers/views when app is launched in the background? 【发布时间】:2013-03-07 23:49:02 【问题描述】:我正在开发一个可因位置事件而在后台启动的应用。从日志中我看到,当这种情况发生时,我的初始 viewController 也会被加载。有没有办法只在应用程序实际激活时才加载?初始视图控制器是通过情节提要设置的。
谢谢。
【问题讨论】:
如何在后台“启动”应用程序? AFAIK,只有用户可以启动应用程序。也就是说,他/她必须触摸一个图标才能启动它。 应用程序可以在后台启动,原因有很多,我知道的一个是基于位置的提醒应用程序。 application:didFinishLaunchingWithOptions: 将使用指示此事件的选项字典调用。 当 didFinishLaunching 返回时,您必须将 something 设置为根视图控制器。 Aaron,我没有手动设置 self.window.rootViewController,它在 application:didFinishLaunchingWithOptions: 被调用时已经被填充,它可能是因为初始场景是在 Storyboard 中配置的。我认为@danh 的答案可能就是我想要的。 【参考方案1】:您可以按如下方式抑制应用程序窗口的自动设置:在情节提要中选择初始视图控制器,转到属性检查器并取消选择“初始场景 -> 是初始视图控制器”。这将生成一个警告,因为该场景现在无法访问。转到身份检查器并设置 Storyboard ID。
为了让应用在您需要时正常工作,请手动设置窗口...
- (void)applicationDidBecomeActive:(UIApplication *)application
BOOL condition = /* whatever condition that makes you want to present the UI */
if (!application.keyWindow.rootViewController && condition)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
// use the your view controller subclass here if you've made one
UIViewController *vc= [storyboard instantiateViewControllerWithIdentifier:@"the identifier"];
application.keyWindow.rootViewController = vc;
【讨论】:
我尝试了这个解决方案,但在调用 applicationDidBecomeActive 之前出现以下错误:“无法为 UIMainStoryboardFile 'MainStoryboard' 实例化默认视图控制器 - 可能未设置指定的入口点?” 从 info.plist 中删除 'Main storyboard file base name' 可以消除错误,但不能完全正常工作。很快就会报告。 您真的想在每次应用激活时都这样做吗? @danh 你能看看我的问题吗:***.com/questions/46584566/…【参考方案2】:在您的 App Delegate 中设置位置管理器并在那里处理位置事件。将 App Delegate 设置为该位置管理器的代理。
【讨论】:
我有一个单独的单例类来处理我的位置管理器的东西,所以这不是真正的问题。如何避免加载我的主 ViewController 并仅在应用程序变为活动状态时才加载它?我的主 ViewController 通过情节提要自动加载,我可能缺少一些非常简单的东西。谢谢。以上是关于在后台启动应用程序时如何避免加载视图控制器/视图?的主要内容,如果未能解决你的问题,请参考以下文章