我是一名自学成才的iOS编程新手,并通过一本初学者教科书。我试图发布我的第一个移动应用程序,所以我要回过头来清理我的代码。我使用的教科书强调了依赖注入'但我一直在努力使他们的简单例子适应更复杂的应用程序。
该应用程序作为shell运行,并检索/解析txt文件以进行填充。我成功连接了我的模型,它检索/解析数据,以及需要使用以下代码填充的TableViewController:
MyTableViewController {
var data: Data!
}
AppDelegate {
var window: UIWindow?
let data = Data()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let navCon = window!.rootViewController as! MyNavigationController
let tableVC = navCon.topViewController as! MyTableViewController
tableVC.data = data
return true
}
然后我将这个NavigationController嵌入到TabBarController中,因为该应用程序将包含其他选项卡。我尝试了设置rootViewController的相同过程,然后向下钻取,直到我可以设置我的数据变量,但我找不到正确的方法来分层ViewControllers并继续得到错误;
'致命错误:在展开“可选”值时意外发现nil
我尝试了两种不同的方法:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let tabBarCon = window!.rootViewController as! MyTabBarController
let navCon = tabBarCon.presentedViewController as! MyNavigationController
let tableVC = navCon.topViewController as! MyTableViewController
tableVC.data = data
return true
}
和
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let tabBarCon = window!.rootViewController as! MyTabBarController
let navCon = MyNavigationController()
tabBarCon.viewControllers = [navCon]
let tableVC = navCon.topViewController as! MyTableViewController
tableVC.data = data
return true
}
是否有解决方案来纠正此错误,或者我是否会错误地处理此过程?同样,我有一个文件,它可以输入一个txt文件,然后创建一个字典。我需要一个单独的TableViewController才能访问该字典以填充自己,但我希望以最有效和苹果推广的方式实现这一点,而不是像我在第一次设计中那样在同一个文件中实现。
感谢您的帮助!
答案 0 :(得分:0)
我通过这个帖子找到了解决方案;
Aassigning a value to a view controller from AppDelegate.swift
通过重新配置我尝试的第二个解决方案可以实现结果;
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let tabBarCon = window!.rootViewController as! MyTabBarController
let tabBarRootVCs: Array = tabBarCon.viewControllers!
let navCon = tabBarRootVCs[0] as! MyNavigationController
let tableVC = navCon.topViewController as! MyTableViewController
tableVC.data = data
return true
}
答案 1 :(得分:-1)
对于依赖注入,我建议您使用Typhoon。从我的经验来看,它是最好的工具之一。这将帮助您实现应用程序组件,如:
/*
* This is the definition for our AppDelegate. Typhoon will inject the specified properties
* at application startup.
*/
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
definition.injectProperty("cityDao", with: self.coreComponents.cityDao())
definition.injectProperty("rootViewController", with: self.rootViewController())
}
}