簡體   English   中英

iOS UI管理的多個選項卡上的文檔

[英]iOS UImanaged document on multiple tabs

我正在嘗試將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;
    }
}

}

第二個和第三個選項卡可能沒有對托管對象上下文的引用(或至少沒有相同的引用),因此對持久性存儲無法執行任何操作。 提取結果控制器也是如此。

為了使所有三個選項卡都顯示來自同一持久性存儲的信息,它們都需要引用相同的托管對象上下文。 一種方法是制作一個自定義選項卡欄控制器,該控制器具有您根據需要設置的托管對象上下文。 然后,三個選項卡視圖控制器中的每一個都可以觀察選項卡欄控制器的上下文,並在選項卡欄控制器的上下文更改時更新自己的上下文。 這將允許所有三個選項卡指向相同的上下文,因此可以使用公共數據池。

如果每個選項卡顯示與模型不同的實體,則每個選項卡都需要配置自己的提取結果控制器以提取正確的實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM