我仍然是Cocoa编程的新手,我遇到一些问题,了解在启动应用程序时如何/何时初始化某些对象,特别是关于Core Data。我将解释我目前的工作情况以及我要做的事情:
当前设置
我有一个NSOutlineView,我将其用作源列表。 NSOutlineView是使用MainMenu.xib文件中的Interface Builder创建的。 dataSource和NSOutlineView的委托是我的AppDelegate文件。源列表中显示的数据是通过Core Data存储的对象。目前我的所有代码都在App Delegate中。这个设置一切正常,没有问题。
我在寻找:
我想要的是一个单独的文件,用作NSOutlineView的dataSource和delegate。所以我非常想从AppDelegate中获取与源列表相关的所有代码并将其放在我的新文件中。
到目前为止我做了什么:
我创建了我的新文件LTSidebarViewController,它实现了NSOutlineViewDelegate和NSOutlineViewDataSource。我在这个文件中有所有必需的方法, - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item etc.我也进入MainMenu.xib并更改了NSOutlineView的dataSource和delegate指向LTSidebarViewController。我在LTSidebarViewController中有一个名为managedObjectContext的方法,它返回App Delegate的managedObjectContext,如下所示:
-(NSManagedObjectContext *)managedObjectContext{
return [[NSApp delegate] managedObjectContext];
}
所以,通过这个全部设置,在LTSidebarViewController的init方法中,我正在尝试创建一个存储Core Data中当前存储的所有对象的数组。这就是问题所在。我无法从LTSidebarViewController访问App Delegate的managedObjectContext,它总是返回null。我无法访问App Delegate中的任何内容。应用程序确实启动没有任何错误,但显然源列表中没有显示任何内容。此外,即使应用程序启动没有任何错误,applicationDidFinishlaunching方法似乎没有被调用,因为我所在的NSLog都没有显示。
作为尝试可视化应用程序启动时发生的事情的测试,我向App Delegate添加了一个init方法,并输入了一些NSLog方法来输出managedObjectContext。然后我在LTSidebarViewController的init方法中做了同样的事情。结果令我感到困惑。这就是我在控制台中得到的结果:
2012-11-22 10:58:51.297 LecturesTest[70876:303] App Del init
2012-11-22 10:58:51.309 LecturesTest[70876:303] App Del Managed Obj: <NSManagedObjectContext: 0x10063f9a0>
2012-11-22 10:58:51.410 LecturesTest[70876:303] Controller init
2012-11-22 10:58:51.412 LecturesTest[70876:303] Managed Obj: (null)
据此我的理解是初始化了App Delegate,并创建了managedObjectContext。然后初始化LTSidebarViewController并尝试通过我上面提到的方法访问App Delegate的managedObjectContext,但由于某种原因是空的。
这是我不明白的。如何初始化App Delegate并创建其managedObjectContext但之后无法从其他类访问?
我错过了什么或者我的设计是不是很好?我原本以为可以从其他文件访问App Delegate的managedObjectContext。