在 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 在 ios 中获取位置更新
在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]