Swift - 参考视图导航中的控制器按索引号控制器



这段代码说明了我的问题:

对于具有 2 个屏幕(rootViewControllerTableViewController的简单应用程序,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
    }

现在我正在尝试将managedObjectContextappDelegate传递到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)

最新更新