2012-01-05 2 views
1

Я работаю над записью-приложением, и у меня возникают некоторые проблемы с основными данными. Проблема, с которой я сталкиваюсь, заключается в том, что из моих свойств объекта NSManagedObject (NSString) не обновляется после того, как приложение было прервано. Сценарий: (1) Сборка & Запустите приложение, (2) напишите что-нибудь (UITextView), (3) нажмите главную кнопку (фон), (5) Завершите приложение, (6) Откройте приложение, и текст там, (7) отредактируйте текст (или удалите текст), (8) Нажмите главную кнопку, (9) Завершите приложение, (10) снова откройте приложение, а новый текст там не будет.Не удается обновить свойство iOS NSManagedObject

Я думаю, что я локализованы ошибку в этот фрагмент кода/метод:

// Helper method to change page, it takes one argument, tag of the next/prevoius page. 
// This method is called in viewWillAppear. 
- (void)goToPage:(int)tag 
{ 
    // Set up the new current page. 
    currentPage = [pageList objectAtIndex:tag]; 
    NSLog(@"%@", currentPage.pageText); // Returns the old value, not the updated. 
    if ([currentPage.inputType isEqualToString:@"drawing"]) { 
     [pageView changeToDrawing]; 
     toolSegment.selectedSegmentIndex = 0; 

     UIImage * pageImage = [UIImage imageWithData:currentPage.pageImage]; 
     pageView.canvas.image = pageImage; 
    } else if ([currentPage.inputType isEqualToString:@"text"]) { 
     [pageView changeToText]; 
     toolSegment.selectedSegmentIndex = 1; 

     pageView.pageText.text = currentPage.pageText; 
     if (editing) { 
      [undoButton removeFromSuperview]; 
      [redoButton removeFromSuperview]; 
     } 
    } 
    [self updateMenu]; 
} 

Когда я бегу NSLog(@"%@", currentPage.pageText); это показывает, что значение не были обновлены/сохранены.

я установил значение, как это:

- (void)textViewDidEndEditing:(UITextView *)textView 
{ 
    currentPage.pageText = textView.text; 
} 

I Первоначально установить текущую страницу, как это:

// Sets the current page to the last open page 
currentPageTag = pagesNoteblock.lastOpenPage; 
currentPage = [pageList objectAtIndex:currentPageTag]; 

и создавать новые страницы, как это:

NSString * currentInputType; 
if (currentPage.inputType == @"drawing") { 
    currentInputType = @"drawing"; 
} else if ([currentPage.inputType isEqualToString:@"text"]) { 
    currentInputType = @"text"; 
} 

// Sets the current page. 
Page * newPage = [NSEntityDescription insertNewObjectForEntityForName:@"Page" inManagedObjectContext:moc]; 
newPage.createdAt = [NSDate date]; 
newPage.inputType = currentInputType; 

// Adds the new page to the database and to the pageList array. 
[pagesNoteblock addNoteblockPagesObject:newPage]; 
[pageList addObject:newPage]; 

// Sets the current page and clears the textView. 
currentPage = [pageList objectAtIndex:currentPageTag]; 

Я также иметь вспомогательный метод, который должен сохранять содержимое страницы, это вызывается в viewWillDisapears и некоторых других местах:

// Method that saves the current page's image to the database. 
- (void)savePageContent 
{ 
    // Saves the image to the database. 
    if ([currentPage.inputType isEqualToString:@"text"]) { 
     currentPage.pageText = pageView.pageText.text; 
    } else if ([currentPage.inputType isEqualToString:@"drawing"]) { 
     NSData * coreDataImage = [NSData dataWithData:UIImagePNGRepresentation(pageView.canvas.image)]; 
     currentPage.pageImage = coreDataImage; 
    } 
    pagesNoteblock.lastOpenPage = currentPageTag; 
} 

Любая помощь/советы будут оценены!

Обновление: Небольшое пояснение, кажется, что объект «Страница-текст» доступен только один раз, т. Е. Я могу сделать только «разумные» изменения, когда я его впервые создам.

ответ

1

У меня есть две идеи, но не совсем точно:

  1. Вы уверены, когда вы нажмете кнопку домой в textViewDidEndEditing вызывается?
  2. Я подозреваю, что следующий метод делает то, что вы хотите.

    Page * newPage = [NSEntityDescription insertNewObjectForEntityForName: @ "Страница" inManagedObjectContext: moc];

Этот метод вставляет (или создает) новый экземпляр/запись для класса страницы. Доза не обновляет записи, которые уже существуют! Я не вижу, что вы запрашиваете запрос, но когда вы извлекаете из своей базы данных, вы получаете массив, и я предполагаю, что вы показываете только первый (atIndex: 0).

Другими словами, вы сохраняете его, но как новую запись в конце списка своей базы данных.Вы не обновляете тот, который уже отображается.

+0

1. Да и нет. Он сохраняется, когда я нажимаю кнопку «Готово», думая переместить его в «textViewDidChange», но он все равно должен работать. 2. Это действительно хороший момент, но я попытался с помощью NSlog в моем методе создания страницы, где введенный вами код существует, и он только вызывается, когда я этого хочу. – Anders

+0

Потерял волосы над этим. Это была глупая ошибка, как обычно. В моем пользовательском NSManagedObject я реализовал свойство text как '@ syntezise', когда оно должно быть' @ dynamic'. Спасибо в любом случае @Canopus и @gamBit – Anders

2

Хммм, похоже, что вы когда-либо звонили, сохраняя свой NSManagedObjectContext, ваши объекты все еще появляются после того, как вы завершаете приложение? Они спасают?

Нечто похожее на это должно работать после вставки и удаления:

NSError *error; 
[self.context save:&error]; 

self.context быть независимо от вашего NSManagedObjectContext есть.

+0

Привет, Я сохраняю в своем делетете/контроллере приложения в appWillResignActive и appWillTerminate (или то, что они вызывают (не сейчас прямо сейчас)). Нужно ли мне также сохранять в моем другом контроллере? Эта проблема возникает только при текстовом представлении, приложение также поддерживает «рисование», которое сохраняется/обновляется по мере необходимости. Поэтому я подозреваю, что проблема связана с чем-то еще, кроме сохранения. – Anders