我正在阅读 this great tutorial作者在其中解释了如何使用 .xib
文件(第 11 节)将 View Controller 连接到应用程序委托(delegate),以便在不同的 View Controller 中使用核心数据。不幸的是,这篇文章写于 2011 年并且已经过时了,因为 .xib
在 Xcode 5 中不再可用,取而代之的是 Storyboard。
通过快速搜索,我找到了 how to connect AppDelegate to view controller from within storyboard ,通过在识别检查器 Pane 上使用 View Controller 的 Storyboard唯一标识符。但是,我想知道是否有必要在当前开发环境(Xcode 5 和 iOS 7)中的 appdelegate 中建立这样的连接,因为即使我不费心做这样的连接,我也没有任何问题 - 所有我所做的是在 AppDelegate.h
中导入 View Controller 并将其实例声明为属性(即 @property (strong, nonatomic) MyViewController *myViewController;
),最后连接 managedObjectContext
位于两个对象之间,因此我什至没有将其声明为 IBOutlet
,正如上述帖子的作者所解释的那样。
我已经用它运行了模拟器,到目前为止我还没有遇到任何问题。然而,“到目前为止”意味着我所写的只是 View Controller 的 managedObjectContext
与 App Delegate 的连接,我想知道它是否必须连接为 IBOutlet
从 Storyboard 中进行更复杂的实现,包括插入和删除托管对象或将 TableView 连接到 NSFetchedResultsController
。
那么谁能教我应该走哪条路呢?如果它不需要显式连接,那么为什么旧版本需要它而不是现在?
最佳答案
Apple 标准 XCode 模板项目从 AppDelegate 分配 viewController 的 managedObjectContext 属性,如下面的代码所示,我在其中注释掉了属性的设置。这种方法的问题在于,如果设置核心数据堆栈需要很长时间(例如,在迁移大型存储文件时),这种方法将阻塞 UI。
在 v4 示例应用程序中,masterViewController 在发送通知时设置了 managedObjectContext - 同时它显示“正在加载,请稍候...”消息。下载并运行该应用或观看视频。
您可以通过多种方式在您的 viewController 中设置 managedObjectContext,只要您在执行创建、删除或修改对象等操作时使用相同的 managedObjectContext 即可。查看此处的示例应用程序,了解我如何使用单例对象创建核心数据堆栈,并在必要时管理商店与 iCloud 之间的迁移。每个 viewController 在需要时直接访问单例的 managedObjectContext。示例中的 detailViewController 具有 managedObject 属性,它使用 managedObject 的 managedObjectContext 来处理任何更新(保存),因此无需直接设置 managedObjectContext 属性。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;
UINavigationController *masterNavigationController = splitViewController.viewControllers[0];
MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController;
//controller.managedObjectContext = [[OSCDStackManager sharedManager] managedObjectContext];
} else {
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
//controller.managedObjectContext = [[OSCDStackManager sharedManager] managedObjectContext];
}
FLOG(@"didFinishLaunchingWithOptions done.");
return YES;
}
关于ios - 在 Xcode 5 的核心数据应用程序中从 AppDelegate 连接到 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21325507/