在 Swift 应用程序中初始化子系统的位置

Posted

技术标签:

【中文标题】在 Swift 应用程序中初始化子系统的位置【英文标题】:Where to Initialize Subsystems in Swift Apps 【发布时间】:2019-01-19 16:13:51 【问题描述】:

我有一些子系统需要在我的 swift 应用程序中初始化。不幸的是,视图控制器是在 AppDelegate 之前初始化的。我可以将只需要在启动时运行一次的代码放在哪里?

我尝试了 application(_:didFinishLaunchingWithOptions:) 但它是在我的 ViewController 初始化之后调用的。

在尝试快速调试 ViewController 并将其设置为初始视图控制器时会出现此问题。

复制步骤: 在下面的两个 *'d 行上放置一个断点。 MyTableViewController.init 在 AppDelegate .didFinishLaunchingWithOptions 之前被命中

class MyTableViewController: UITableViewController

    required init?(coder aDecoder: NSCoder) 
***     print("init coder style")
        super.init(coder: aDecoder)
    

... AppDelegate ...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
***     UIApplication.shared.isIdleTimerDisabled = true

        return true
    

【问题讨论】:

可能是application(_:didFinishLaunchingWithOptions:)? developer.apple.com/documentation/uikit/core_app/… 可能相关:***.com/questions/25760621/… 它在我的初始 ViewController 中的 init 函数之后被调用。我将编辑我的问题。 “但它是在我的 ViewController init 之后调用的”它应该 NOT...顺便说一句,您能否详细说明“ViewController init”的含义是什么?! application(_:didFinishLaunchingWithOptions:) 应该在应用程序中的任何视图控制器初始化之前执行。 谢谢,我已经在我原来的问题中添加了一些细节,以准确显示正在发生的事情。 【参考方案1】:

最简单的方法是将其放在AppDelegate 中。您可以为此使用application(_:didFinishLaunchingWithOptions:) 函数。

如果您要设置很多内容,您可能希望为此创建一个单独的“协调器”类,而不是让AppDelegate 变得混乱。

在 Info.plist 中与 UIMainStoryboardFile 一起使用

如果您在Info.plist 中设置了UIMainStoryboardFile 键,AppDelegate 将自动加载主情节提要。这将在调用 application(_:didFinishLaunchingWithOptions:) 之前初始化初始视图控制器。

解决办法是去掉UIMainStoryboardFile键,手动加载storyboard如下:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
  // Do your setup here

  let storyboard = UIStoryboard(name: "Main", bundle: nil)
  guard let rootViewController = storyboard.instantiateInitialViewController() else 
    fatalError("No intitial view controller configured in Main.storyboard")
  

  window.rootViewController = rootViewController
  window.makeKeyAndVisible()
  return true

【讨论】:

以上是关于在 Swift 应用程序中初始化子系统的位置的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何在应用程序运行时顺利加载谷歌地图视图

即使应用程序在后台运行,如何使用 swift 在 ios 中获取位置更新

在 Swift 中禁用动态类型

在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]

尝试在启动应用程序时使用 Swift 在 Xcode 中查找用户位置但出现可选错误?

导航控制器工具栏大小和位置 - iOS Swift