2012-01-31 66 views
3

首先,我应该提到这是我在这个网站上的第一篇文章。我试图教自己编程iOS,并在我的谷歌搜索找到答案,我发现我一直在这里指导。所以,感谢所有在这里做出贡献的人。你已经帮了我一吨。你如何处理UIManagedDocument?

我一直在经历斯坦福CS193P阶级,喜欢它。但我现在卡住了,不知道该在哪里转。

我的问题已经与UIManagedDocument。

我累了做一个简单的应用程序来测试我的新技能。这就是它的作用:

一个简单的会计应用程序,跟踪对募捐活动的个人贡献。

我有一个UITabBar,在每个选项卡上,您可以: 1.跟踪参与者(玩家) - 这将连接到地址簿,并允许您添加或保留在这个应用程序中。 2.管理事件(事件) - 您可以添加,编辑或删除事件,然后您将添加参与者,然后能够添加他们带来(银行)在该事件。 3.设置。 - 我添加了一些按钮,只是为了帮助我理清现在的情况,包括清除所有数据的重置按钮和“虚拟数据”按钮。

我有三个coreData实体。玩家,事件和银行都与其他两个人有关系。

当我第一次尝试将这个应用程式(预iOS5中)我用的appDelegate创建我ManagedObjectContext,并通过它我viewControllers。这工作。但现在我应该使用UIManagedObjectDocument,而不是使用AppDelegate。我相信我了解iCloud的原则和整合。 (我可能是错的)

使用类的例子和我可以在网上找到的东西我做了一个帮助程序类,它将在我的UINavigationControllers中提供每个ViewController的第一个ManagedDocument。

+ (UIManagedDocument *)sharedManagedDocument 
{ 
    static UIManagedDocument *sharedDocument = nil; 

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"]; 
    // url is "<Documents Directory>/<DefaultAppDatabase>" 

    // Create the shared instance lazily upon the first request. 
    if (sharedDocument == nil) { 
     sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
    } 

    if (sharedDocument.fileURL != url) { 
     UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
     sharedDocument = newDocument; 
    } 

    NSLog(@"SharedDocument: %@", sharedDocument); 

    return sharedDocument; 
} 

然后我有第一个ViewController打开文档并执行获取。

从那里,我通过什么NSManagedObject通过SEGUE选择下一个视图控制器。

问题是当我开始添加或重新设置数据时。 (我假设如果我能使它与“虚拟数据”按钮一起工作,我可以让它在单个条目中工作)当我按下“重置”或“虚拟”按钮时,我的日志告诉我它是推,但我没有看到任何数据的变化,直到我重新启动应用程序。然后它显示完美。我的猜测是我没有正确保存文件,或者我没有正确刷新tableViews。我对使用NSNotification做了一个小小的尝试,但是没有深入,因为我无法对它做出任何回应。如果需要的话,我很乐意回到那条路上。

这是我的保存方法?非常简单,只是从默认coreData的appDelegate复制。

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
     { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 

    [self.appDatabase saveToURL:self.appDatabase.fileURL 
       forSaveOperation:UIDocumentSaveForOverwriting 
       completionHandler:^(BOOL success){ 
        if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName); 
        if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName); 
       }]; 

} 

保罗,从CS193P讲师,建议在作业6使用一个辅助方法通过一块周围的UIManagedDocument通过。我理解背后的理论,但还没有完全包围我的头,所以我没有排除我的答案也可能存在。

非常感谢您的帮助,或指引我在正确的方向做更多的研究。对不起,这篇文章太长了,我想尽可能清楚。

回答