首先,我应该提到这是我在这个网站上的第一篇文章。我正试图自学如何编写iOS程序,在我的谷歌搜索结果中,我发现我经常被引导到这里。因此,感谢所有在这里做出贡献的人。你已经帮了我很多忙了。
我已经参加了斯坦福大学的CS193P课程,我很喜欢它。但我现在被困住了,不知道该向哪里求助。
我的问题在于UIManagedDocument。
我试着做一个简单的应用程序来测试我的新技能。这就是它的作用:
一个简单的会计应用程序,跟踪个人对筹款活动的贡献。
我有一个UITabBar,在每个选项卡上允许您: 1.跟踪参与者(玩家)-这将连接到通讯簿,并允许您添加他们或只是将他们保留在此应用程序中。2.管理事件( events ) -您可以添加、编辑或删除事件,然后将参与者添加到其中,然后能够添加他们在该事件中带来的内容(银行)。3.设置。-我添加了一些按钮,只是为了帮助我弄清楚一些东西,包括一个清除所有数据的重置按钮和一个“虚拟数据”按钮。
我有三个coreData实体。玩家、事件和银行都与其他两个有关系。
当我第一次尝试制作这个应用程序(pre iOS5)时,我使用appDelegate来创建我的ManagedObjectContext,并将其传递给我的viewControllers。这招奏效了。但是现在我应该使用UIManagedObjectDocument而不是AppDelegate。我相信我理解iCloud的原理和集成。(我可能错了)
使用类中的示例和我可以在网上找到的内容,我创建了一个帮助器类,它将在我的UINavigationControllers中提供每个ViewControllers的第一个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传递给下一个ViewController。
问题是当我开始添加或重置数据时。(我假设如果我能让它与“虚拟数据”按钮一起工作,我就能让它在单个条目上工作)当我按下“重置”或“虚拟”按钮时,我的日志告诉我它是被按下的,但在我重新启动应用程序之前,我看不到数据有任何变化。然后它就会完美地显示出来。我的猜测是我没有正确地保存文件,或者我没有正确地刷新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。我得到了积木背后的理论,但还没有完全理解它们,所以我不排除我的答案可能也在那里。
非常感谢你的帮助,或者给我指明了做更多研究的正确方向。抱歉,这篇文章太长了,我已经尽量说清楚了。
发布于 2012-02-13 09:04:55
我把整件事都想多了。Alan在这篇文章中完美地问了我一个问题:
这个问题和答案把一切都搞清楚了。
谢谢
https://stackoverflow.com/questions/9083088
复制相似问题