0

我正在使用斯坦福的 CoreDataTableViewController 来显示动态表。

应用程序如何工作:要向该表中添加一行,会弹出一个子屏幕进行数据输入,当子屏幕关闭时,插入新创建的 managedObject,并通过回调重新加载表。

我注意到在重新进入屏幕后,新添加的行会间歇性地从表中丢失。我注意到这种行为仅在第一次使用 saveToURL 创建 UIManagedDocument 对象时发生。随后,在重新启动应用程序并使用 openWithCompletionHandler 打开 UIManagedDocument 后,列表始终正确显示。

这是我用来创建/打开 UIManagedDocument 的代码:

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidLoad");
        onDocumentReady(self.document);
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
    {
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateClosed)
    {
        NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateNormal)
    {
        OnDocumentDidLoad(YES);
    }
}

运行上述代码时,始终调用 onDocumentDidLoad(),成功标志为 YES。

非常感激任何的帮助。提前致谢!

- 编辑以下代码以显示我的创建方法,然后关闭并重新打开文档以响应 Jody - 我仍然遇到同样的问题。---

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidLoad success: %d", success);
        onDocumentReady(self.document);
    };

    void (^OnDocumentDidClose)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidClose, openWithCompletionHandler success: %d", success);
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    };

    void (^OnDocumentDidSave)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidSave success: %d", success);
        if (self.document.documentState == UIDocumentStateClosed)
        {
            NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad from onDocumentDidSave - was closed");
            [self.document openWithCompletionHandler:OnDocumentDidLoad];
        }
        else if (self.document.documentState == UIDocumentStateNormal)
        {
            // TODO Close and reopen?
            NSLog(@"Calling closeWithCompletionHandler:OnDocumentDidClose from onDocumentDidSave - was normal");

            [self.document closeWithCompletionHandler:OnDocumentDidClose];
        }
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
    {
        // Database doesn't exist, create it, then close and reopen in completion handler
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidSave];
    }
    else if (self.document.documentState == UIDocumentStateClosed)
    {
        // Open existing database
        NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateNormal)
    {
        // Already opened
        OnDocumentDidLoad(YES);
    }
}
4

1 回答 1

0

您没有指明您使用的是哪个版本的 iOS,这几乎总是很重要的。

创建文档时出现 iOS 5 问题。很久以前,我在创建UIManagedDocument. 它仍然在我的库代码中,因为我从来没有足够的动力花时间查看问题是否得到解决。

如果文档不存在,请将其保存以供创建,并在完成处理程序中将其关闭,然后在该完成处理程序中将其打开。这样,除非它已经存在,否则我从未真正使用过文档。

于 2013-04-23T13:32:03.340 回答