2013-04-23 2 views
0

Я использую CoreDataTableViewController от Stanford для отображения динамической таблицы.Таблица iOS CoreDataTableViewController, когда UIManagedDocument создается с помощью saveToURL

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

Я заметил, что вновь добавленные строки периодически исчезают из таблицы при повторном входе в экран. Я заметил, что это поведение происходит только тогда, когда объект UIManagedDocument создается впервые с помощью saveToURL. Впоследствии, после перезапуска приложения и открытия UIManagedDocument с помощью openWithCompletionHandler, список всегда отображается правильно.

Вот код, я использую, чтобы создать/открыть 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); 
    } 
} 

ответ

0

Вы не указали, какую версию iOS вы используете, что почти всегда важно.

При создании документа возникла проблема с iOS 5. Я прибегал к следующему давно, когда создал UIManagedDocument. Он по-прежнему находится в моем библиотечном коде, поскольку я никогда не был достаточно мотивирован, чтобы найти время, чтобы выяснить, были ли проблемы исправлены.

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

+0

Спасибо за ваш ответ. Я нахожусь на iOS 6. Да, я также пытался закрыть его в обработчике завершения и снова открыть его, но это не помогло - пустые строки все еще появляются. – iht

+0

Я добавил код, который включает мои усилия по повторному открытию вновь созданного документа. Правильно ли это выглядит? К сожалению, пустые строки все еще происходят с перерывами. Как и прежде, перезапуск приложения после его убийства исправляет проблему, но, очевидно, это неприемлемо. – iht

+0

ИМО, вы теряете местность справочного пособия, определяя свои блоки как переменные. Во всяком случае, он выглядит несколько разумным. Вы уверены, что ожидаете прибытия асинхронного обратного вызова, прежде чем пытаться заполнить документ? Лично я не устанавливаю свойство документа, пока документ не будет открыт и не будет готов к работе ..., что предотвратит преждевременное использование. –