Я использую 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);
}
}
Спасибо за ваш ответ. Я нахожусь на iOS 6. Да, я также пытался закрыть его в обработчике завершения и снова открыть его, но это не помогло - пустые строки все еще появляются. – iht
Я добавил код, который включает мои усилия по повторному открытию вновь созданного документа. Правильно ли это выглядит? К сожалению, пустые строки все еще происходят с перерывами. Как и прежде, перезапуск приложения после его убийства исправляет проблему, но, очевидно, это неприемлемо. – iht
ИМО, вы теряете местность справочного пособия, определяя свои блоки как переменные. Во всяком случае, он выглядит несколько разумным. Вы уверены, что ожидаете прибытия асинхронного обратного вызова, прежде чем пытаться заполнить документ? Лично я не устанавливаю свойство документа, пока документ не будет открыт и не будет готов к работе ..., что предотвратит преждевременное использование. –