ios - 在 Xcode 5 的核心数据应用程序中从 AppDelegate 连接到 ViewController

标签 ios objective-c xcode core-data appdelegate

我正在阅读 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 属性。

http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

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

相关文章:

ios - 我应该如何正确执行此委托(delegate)?

ios - 我如何确定 NSData 的内容何时指示 Web 服务请求失败?

ios - UIScrollView Zoom 在 iOS 7 中不起作用,但在 iOS 8 中运行良好

ios - 迪尔德 : Symbol not found: Xcode 11 crash

ios - MapKit 覆盖不出现

iphone - 一旦将 webapp 添加到主屏幕,是否可以强制 iphone/ipod 更新 apple-touch-icon?

ios - 在 iOS 后台运行一个 Http 服务器

ios - 如何将 UIBarButtonItem 放在 Swift4 上的 NavigationController 的 ViewController 上?

javascript - window.opener 为空(iOS 12.3.1 Safari 和 Chrome)

ios - Storyboard中的自定义 UIView 不显示 subview