2013-07-02 3 views
0

В моем приложении у меня есть UITableView и 2 кнопки «Сохранить» и «Загрузить». В моем случае, когда пользователь сохраняет свой дорожку, мой UITableView добавляет новую ячейку с названием своей дорожки, а затем, когда пользователь удаляет ячейку, она будет повторно загружать свой трек. Это работает нормально, но всякий раз, когда пользователь сохраняет одну дорожку, затем пытается сохранить другую, вновь добавленная ячейка повторно загружает только один трек. Итак, в моем табличном представлении может быть 10 ячеек с именами, но всякий раз, когда вы нажимаете один, сохраняется только один трек. Поэтому мой вопрос: как я могу сохранить данные для каждой ячейки? Вот моя функция сохранения:UITableView Cell не сохраняет данные правильно?

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:NSStringFromCGPoint(ball.center) forKey:@"ballPosition"]; 
[userDefaults synchronize]; 

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults]; 
[block1DF setObject:NSStringFromCGPoint(block1.center) forKey:@"block1Position"]; 
[block1DF synchronize]; 

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults]; 
[block2DF setObject:NSStringFromCGPoint(block2.center) forKey:@"block2Position"]; 
[block2DF synchronize]; 

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults]; 
[block3DF setObject:NSStringFromCGPoint(block3.center) forKey:@"block3Position"]; 
[block3DF synchronize]; 

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults]; 
[winBlockDF setObject:NSStringFromCGPoint(winBlock.center) forKey:@"winBlockPosition"]; 
[winBlockDF synchronize]; 

NSString *trackName = [[alertView textFieldAtIndex:0] text]; 
trackTitle.text = trackName; 

[trackArray addObject:[NSString stringWithFormat:trackName,[trackArray count]+1]]; 
[self.myTableView reloadData]; 

тогда мой Tableview didSelectRowAtIndexPath:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
CGPoint ballPoint = CGPointFromString([userDefaults objectForKey:@"ballPosition"]); 
[ball setCenter:ballPoint]; 

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block1Point = CGPointFromString([block1DF objectForKey:@"block1Position"]); 
[block1 setCenter:block1Point]; 

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block2Point = CGPointFromString([block2DF objectForKey:@"block2Position"]); 
[block2 setCenter:block2Point]; 

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block3Point = CGPointFromString([block3DF objectForKey:@"block3Position"]); 
[block3 setCenter:block3Point]; 

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults]; 
CGPoint winBlockPoint = CGPointFromString([winBlockDF objectForKey:@"winBlockPosition"]); 
[winBlock setCenter:winBlockPoint]; 
+0

У меня есть лучший вопрос, как мы можем решить вашу проблему, не видя исходный код? Пожалуйста, разместите соответствующий код, чтобы мы могли его проверить и, возможно, найти проблему;) – danypata

+0

Сохраните приведенные фрагменты кода, а не комментарии. – WrightsCS

+1

Этот код ужасен. 1.) Вам не нужно вызывать 'synchronize', если вам не нужны эти значения немедленно. 2.) Вам не нужно создавать новый/отдельный экземпляр «NSUserDefaults» для каждого значения, которое вы пытаетесь сохранить. Ваш код можно по существу сократить: http://pastie.org/8104985 – WrightsCS

ответ

1

Причина вы можете сохранить только одну копию данных, не потому, что у вас есть ошибка. Это связано с тем, что NSUserDefaults может сохранять только одну версию «ballPosition». Каждый раз, когда вы сохраняете другое «ballPosition», он заменяет существующее «ballPosition».

Я предлагаю не использовать NSUserDefaults вообще. Обычно, когда вы хотите сохранить много версий похожих данных, вы хотите использовать Core Data.

Хороший учебник здесь http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started НО если вы хотите краткий обзор здесь:

Если вы создаете новый проект в Xcode, выберите Master-Detail приложение и выберите Использовать Core Data вы будете иметь новое ядро приложение с поддержкой данных.

Это демонстрационное приложение создает таблицу объектов «Событие», каждая из которых имеет свойство «timestamp».

Каждый раз, когда вы нажмете на кнопку Добавить следующий код запуска:

- (void)insertNewObject:(id)sender 
{ 
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; 
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 

    // If appropriate, configure the new managed object. 
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template. 
    [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"]; 

    // Save the context. 
    NSError *error = nil; 
    if (![context 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(); 
    } 
} 

Это создает новый объект Event, устанавливает текущую дату ключа TIMESTAMP и сохраняет объект в локальной базе данных.

Огромное преимущество заключается в том, что теперь вы отлично используете шаблон архитектуры MVC или Modal View Controller. У вас есть целый модальный (и базовый) уровень, который работает независимо от ваших представлений и ваших контроллеров.

Вы также используете UITableViews правильно, у вас есть NSFetchedResultsController, который будет поддерживать вашу таблицу в актуальном состоянии в любое время, когда что-либо изменится, и у вас есть отдельное подробное представление для отображения элементов в вашей таблице.

Несколько вещей, которые нужно иметь в виду, с Core Data:

  1. У вас есть схемы для базы данных. Вы можете отредактировать свою схему из файла xcdatamodeld в Xcode. Все, что вы храните в своей модели, должно быть определено здесь.
  2. Если вы просто возитесь, вы можете переустанавливать свое приложение каждый раз, когда вы меняете xcdatamodel, и он будет работать нормально, в противном случае вам нужно иметь дело с миграциями и различными версиями вашей схемы.
  3. Основные данные - это не самый простой инструмент для изучения, но как только вы его узнаете, у вас будет намного лучшая отправная точка при создании приложений.
+0

Я очень ценю это, но я действительно не хочу перезапускать весь свой проект. Есть ли способ реализовать это в приложении с одним просмотром? Я уже импортировал фреймворк CoreData – Chase

+0

Вы определенно можете, у учебника, с которым я связан, есть некоторые шаги для этого. В основном вам нужно добавить файл xcdatamodald, создать контроллер NSFetchedResults и т. Д. Я бы просто импортировал код из нового проекта, который вы создали. –

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