这段代码说明了我的问题:
对于具有 2 个屏幕(rootViewController
和TableViewController
的简单应用程序,rootVC
将在索引 [0] 处navigationController
,下一个视图会将索引递增 1
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let navController = self.window?.rootViewController as! UINavigationController
let firstViewController = navController.viewControllers[0] as! firstViewController
firstViewController.managedObjectContext = self.managedObjectContext
return true
}
现在我正在尝试将managedObjectContext
从appDelegate
传递到rootViewController
后面的视图控制器:
中心视图rootViewController
,我想managedObjectContext
传递到旁边的屏幕,上方和下方。
我尝试将其从appDelegate
传递到rootViewController
,然后从rootViewController
传递到下一个视图,但它不起作用。
有人请告诉我如何知道遵循相同视图的视图的索引号?谢谢!
现在我正在尝试将 managedObjectContext 从 appDelegate 传递到 rootViewController 后面的 ViewController。
你不能。整个想法毫无意义。在应用委托中的代码运行时,这些视图控制器尚不存在。情节提要只是一组用于制作视图控制器的未来实例的指令;在application:didFinishLaunchingWithOptions:
期间没有这样的实例 — 除了你在代码中显式创建的第一个实例。
相反,这些视图控制器中的每一个都需要在自己的代码(例如其viewDidLoad
)中从应用程序委托中获取managedObjectContext
。这是他们都可以轻松完成的操作,因为应用程序委托具有 managedObjectContext
属性,并且他们都可以看到该属性,因为他们都可以看到应用程序委托(因为它是共享应用程序的delegate
)。
我不太同意上面的答案,因为从视图控制器或任何其他对象获取应用程序委托只是为了获取其存储的属性被认为是一种不好的做法。
您可以做的是,当您使用 prepareForSegue
方法向下移动视图层次结构时,可以使用依赖关系注入的概念沿视图控制器传递 managedObjectContext(如果您正在执行 segue)或将其分配给下一个视图控制器(如果您正在以编程方式在导航堆栈上实例化和推送它)。
// App delegate: - didFinishLaunchingWithOptions
let navCon = window?.rootViewController as? UINavigationController
let rootVC = navCon?.viewControllers.first as? firstViewController
rootVC?.managedObjectContext = managedObjectContext
// FirstViewController: - Using segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
guard let identifier = segue.identifier else { return }
switch identifier {
case "SecondView":
let navCon = segue.destinationViewController as? UINavigationController
let controller = navCon?.topViewController as? SecondViewController
controller?.managedObjectContext = self.managedObjectContext
default:
break
}
}
// FirstViewController: - Pushing programmatically
let controller = SecondViewController()
controller.managedObjectContext = self.managedObjectContext
navigationController?.pushViewController(controller, animated: true)