【问题标题】: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 的答案可能就是我想要的。

标签: ios objective-c memory-management


【解决方案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 你能看看我的问题吗:stackoverflow.com/questions/46584566/…
【解决方案2】:

在您的 App Delegate 中设置位置管理器并在那里处理位置事件。将 App Delegate 设置为该位置管理器的代理。

【讨论】:

  • 我有一个单独的单例类来处理我的位置管理器的东西,所以这不是真正的问题。如何避免加载我的主 ViewController 并仅在应用程序变为活动状态时才加载它?我的主 ViewController 通过情节提要自动加载,我可能缺少一些非常简单的东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多