Swift - 使用索引号

时间:2016-05-21 21:08:20

标签: swift appdelegate managedobjectcontext

此代码说明了我的要求:

对于有2个屏幕的简单应用,rootViewControllerTableViewControllerrootVC将位于navigationController的索引[0],下一个视图将会增加指数按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后面的ViewControllers:

中心视图为rootViewController,我想将managedObjectContext传递到下一个,上方和下方的屏幕。

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

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

2 个答案:

答案 0 :(得分:1)

  

现在我试图将adminObjectContext从appDelegate传递给rootViewController后面的ViewControllers

你不能。整个想法毫无意义。在app delegate中的代码运行时,那些视图控制器尚不存在。故事板只是一组指令,用于制作视图控制器的未来实例;在<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul> <li class="list" data-name="Paul" data-id="2">Paul</li> <li class="list" data-name="Paul" data-id="4">Paul</li> <li class="list" data-name="Peter" data-id="3">Peter</li> <li class="list" data-name="Peter" data-id="1">Peter</li> <li class="list" data-name="John" data-id="11">John</li> <li class="list" data-name="John" data-id="12">John</li> </ul>期间没有此类实例 - 除了您在代码中明确地显示的第一个实例外。

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

答案 1 :(得分:0)

我不完全赞同上面的答案,因为从您的视图控制器或其他任何对象获取您的应用代表被认为是一个不好的做法只是为了得到它& #39;存储的属性。

如果要执行segue或将其分配给下一个segue,则使用prepareForSegue方法向下移动视图层次结构时,可以使用依赖项注入的概念沿视图控制器传递managedObjectContext如果要以编程方式实例化并在导航堆栈上推送它,请查看控制器。

    // 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)