【问题标题】:iOS UImanaged document on multiple tabs多个选项卡上的 iOS UImanaged 文档
【发布时间】:2015-03-25 23:03:00
【问题描述】:

我正在尝试为多个选项卡使用 UIManagedDocument 上下文,以从我的数据库中检索和存储数据。但是,它只能在我在第一个选项卡上时检索信息。第二个和第三个选项卡不显示数据,我无法使用它们将数据插入核心数据。我使用检索到的上下文来设置通用 NSFetchController,但正如我所说,这仅适用于第一个选项卡。我做错了什么?

- (NSManagedObjectContext *)managedObjectContext {
if (_document.managedObjectContext) {
    return _document.managedObjectContext;
}

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]; // Default location to store the document
NSString *documentName = @"ModelDocument";
NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];
self.document = [[UIManagedDocument alloc] initWithFileURL:url];

if ([fileManager fileExistsAtPath:[url path]]) { // If already exists, open the document
    [self.document openWithCompletionHandler:^(BOOL success) {
        if (success) {
            [self announceContextReady];
        } else {
            NSLog(@"Problem with database!");
        }
    }];
} else {
    [self.document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { // Document doesnt exist, create it
        if (success) {
            [self announceContextReady];
        } else {
            NSLog(@"Problem with saving!");
        }
    }];
}
return _document.managedObjectContext;

}

获取控制器(不适用于第二个或第三个选项卡):

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
    case NSFetchedResultsChangeInsert: {
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
    }

    case NSFetchedResultsChangeDelete: {
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
    }

    case NSFetchedResultsChangeUpdate: {
        [self configureCell:(UITableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;
    }

    case NSFetchedResultsChangeMove: {
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
    }
}

}

【问题讨论】:

    标签: ios uimanageddocument


    【解决方案1】:

    第二个和第三个选项卡可能没有对托管对象上下文的引用(或者至少不是同一个),因此不能对持久存储做任何事情。 fetched results 控制器也是如此。

    为了让所有三个选项卡都显示来自同一个持久性存储的信息,它们都需要引用同一个托管对象上下文。一种方法是制作一个自定义选项卡栏控制器,该控制器具有您根据需要设置的托管对象上下文。然后,三个选项卡视图控制器中的每一个都可以观察选项卡栏控制器的上下文并在选项卡栏控制器的上下文更改时更新它们自己的上下文。这将允许所有三个选项卡指向相同的上下文,因此可以使用公共数据池。

    如果每个选项卡显示的实体与您的模型不同,则它们都需要配置自己的获取结果控制器以提取正确的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多