此代码说明了我的要求:
对于有2个屏幕的简单应用,rootViewController
和TableViewController
,rootVC
将位于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
}
现在我尝试将managedObjectContext
从appDelegate
传递到rootViewController
后面的ViewControllers:
中心视图为rootViewController
,我想将managedObjectContext
传递到下一个,上方和下方的屏幕。
我尝试将其从appDelegate
传递到rootViewController
,然后从rootViewController
传递到下一个视图,但它不起作用。
有人请告诉我如何知道同一视图后的观点的索引号?谢谢!
答案 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)