2015-03-25 6 views
0

Я пытаюсь использовать контекст UIManagedDocument для нескольких вкладок для извлечения и хранения данных из моей базы данных. Тем не менее, он может получать информацию только тогда, когда я нахожусь на первой вкладке. На второй и третьей вкладках нет данных, и я не могу вставлять данные в основные данные с ними. Я использую полученный контекст, чтобы настроить общий NSFetchController, но, как я сказал, это работает правильно только для первой вкладки. Что я делаю не так?iOS UI-управляемый документ на нескольких вкладках

- (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; 

}

Fetch контроллер (не работает на второй или третьей вкладке):

- (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; 
    } 
} 

}

ответ

0

Второй и третий выступы, вероятно, не имеют ссылку на (или, по крайней мере, не одно и то же), и как таковой не может ничего сделать с постоянным хранилищем. То же самое можно сказать и о получаемом контроллере результатов.

Чтобы все три вкладки отображали информацию из одного и того же постоянного хранилища, все они должны иметь ссылку на один и тот же контекст управляемого объекта. Один из способов сделать это - создать пользовательский контроллер панели вкладок, который имеет настраиваемый контекст объекта, который вы установите по мере необходимости. Каждый из трех контроллеров представления таблиц мог бы наблюдать контекст контроллера панели вкладок и обновлять свой собственный контекст при изменении контекста контроллера панели вкладок. Это позволит всем трем вкладкам указывать на один и тот же контекст и, следовательно, работать с общим пулом данных.

Если на каждой вкладке отображается другая сущность из вашей модели, каждому из них будет нужен собственный контроллер результатов, настроенный на то, чтобы вытащить правильный объект.

Смежные вопросы