0

这段代码说明了我在问什么:

对于具有 2 个屏幕的简单应用程序, the和rootViewControllera将位于索引 [0] in ,下一个视图将索引增加 1TableViewControllerrootVCnavigationController

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
    }

现在我试图managedObjectContextappDelegate后面的 ViewControllers传递rootViewController

中心视图是rootViewController,我想传递managedObjectContext到下一个、上面和下面的屏幕。

我尝试将它从appDelegateto传递到rootViewController,然后将 from 传递rootViewController到下一个视图,但它不起作用。

任何人请告诉我如何知道同一视图之后的视图的索引号?谢谢!

4

2 回答 2

1

现在我正在尝试将 managedObjectContext 从 appDelegate 传递到 rootViewController 后面的 ViewControllers

你不能。整个想法毫无意义。在应用程序委托中的代码运行时,这些视图控制器还不存在。故事板只是一组用于制作未来视图控制器实例的指令;期间没有这样的实例——除了你在代码中明确创建的第一个实例。application:didFinishLaunchingWithOptions:

相反,这些视图控制器中的每一个都需要在他们自己的代码(例如他们的 )中从应用程序委托中获取。这是他们都可以轻松做到的,因为应用程序委托有一个属性,并且他们都可以看到该属性,因为他们都可以看到应用程序委托(因为它是共享应用程序的)。managedObjectContextviewDidLoadmanagedObjectContextdelegate

于 2016-05-21T21:39:04.273 回答
0

我不太同意上面的答案,因为从视图控制器或任何其他对象中获取应用程序委托只是为了获取它的存储属性被认为是一种不好的做法。

你可以做的是使用依赖注入的概念来传递 managedObjectContext 沿着你的视图控制器,当你向下移动视图层次结构时,prepareForSegue如果你正在执行 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)
于 2016-05-22T04:50:08.407 回答