Прежде всего, я должен отметить, что это мой первый пост на этом сайте.Я пытаюсь научить себя программировать iOS, и в моих поисках ответов в Google я обнаружил, что меня постоянно направляют сюда.Так что спасибо всем, кто внес свой вклад здесь.Вы уже помогли мне много.
Я прошел класс Stanford CS193P и ЛЮБЛЮ его.Но я застрял прямо сейчас и не уверен, куда обратиться.
Моя проблема была с UIManagedDocument.
Я устал делать простое приложение, чтобы проверить свои новые навыки.Вот что он делает:
Простое бухгалтерское приложение, которое отслеживает отдельные вклады в мероприятие по сбору средств.
У меня есть UITabBar, который на каждой вкладке позволяет: 1. Отслеживать участников (игроков) - Это позволит подключиться к адресной книге и позволит вам добавить их или просто сохранить их в этом приложении.2. Управление событиями (событиями). Вы можете добавлять, редактировать или удалять события, к которым затем будете добавлять участников, а затем сможете добавлять то, что они принесли (Банк) в это событие.3. Настройки.- Я добавил несколько кнопок, чтобы помочь мне разобраться во всем, включая кнопку сброса, которая очищает все данные, и кнопку «фиктивных данных».
У меня есть три объекта coreData.Игроки, события и банк имеют отношения с двумя другими.
Когда я впервые попытался создать это приложение (до iOS5), я использовал appDelegate, чтобы создать свой ManagedObjectContext и передать его моим viewControllers.Это сработало.Но теперь я должен использовать UIManagedObjectDocument и не использовать AppDelegate.Я верю, что понимаю принцип и интеграцию с iCloud.(Я могу ошибаться)
Используя примеры из класса и то, что я мог найти в Интернете, я создал вспомогательный класс, который будет предоставлять первый из каждого из моих ViewControllers в моих UINavigationControllers - ManagedDocument.
+ (UIManagedDocument *)sharedManagedDocument
{
static UIManagedDocument *sharedDocument = nil;
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"];
// url is "<Documents Directory>/<DefaultAppDatabase>"
// Create the shared instance lazily upon the first request.
if (sharedDocument == nil) {
sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
}
if (sharedDocument.fileURL != url) {
UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url];
sharedDocument = newDocument;
}
NSLog(@"SharedDocument: %@", sharedDocument);
return sharedDocument;
}
Затем первый ViewController открывал документ и выполнял выборку.
Оттуда я передаю все, что выбрано NSManagedObject, следующему ViewController через ход.
Проблемы возникают, когда я добавляю или сбрасываю данные.(Я предполагаю, что если я смогу заставить его работать с кнопкой «фиктивные данные», я смогу заставить его работать с отдельной записью) Когда я нажимаю кнопку «Сброс» или «Фиктивный», мои журналы говорят мне, что это былонажал, но я не вижу никаких изменений в данных, пока я не перезапущу приложение.Тогда это обнаруживается отлично.Я думаю, что я не сохраняю файл правильно, или я не обновляю tableViews правильно.Я предпринял небольшую попытку использовать NSNotification, но не стал вдаваться в подробности, так как не мог заставить его реагировать ни на что.Я рад вернуться по этому пути, если мне нужно.
Это мой метод сохранения ... в значительной степени только что скопированный из стандартного coreData appDelegate.
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
[self.appDatabase saveToURL:self.appDatabase.fileURL
forSaveOperation:UIDocumentSaveForOverwriting
completionHandler:^(BOOL success){
if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName);
if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName);
}];
}
Пол,инструктор из CS193P предложил в назначении 6 использовать вспомогательный метод для передачи UIManagedDocument через блок.Я получил теорию за блоками, но не полностью обернул вокруг них голову, поэтому я не исключаю, что мой ответ также может лежать там.
Большое спасибо за любую помощь или за указание на меняправильное направление, чтобы сделать больше исследований.Извините, этот пост такой длинный, я старался быть как можно яснее.