сохранение данных массива NSMutable - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть UITableView, который заполняется с помощью NSMutableArray.Я использую xcode 4.2

, данные в массиве NSMutable остаются на тот случай, если я переключаю приложения, но они стираются в этих двух случаях: 1 - пользователь переключается в режим просмотра и возвращается.

2 - приложение полностью закрыто (т. Е. Пользователь дважды щелкнет по кнопке Main и удалит ее из списка запущенных приложений)

вот код, который я использую

-(NSString *)dataFilePath{

    NSString *dataFilePath;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    dataFilePath = [documentDirectory stringByAppendingPathComponent:@"Test App-Info.plist"];
    return dataFilePath;

}

-(void)saveData{
    [NSKeyedArchiver archiveRootObject:[data copy] toFile:[self dataFilePath]];
}

- (void)loadData
{
    data = [NSKeyedUnarchiver unarchiveObjectWithFile:self.dataFilePath];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
  ...

    //saving the history

    NSArray *archivedArray =[NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
    if (archivedArray == nil) {
        data = [[NSMutableArray alloc] init];
    }
    else {
        [self loadData];
        [mainTableView reloadData];
    }
}

Пожалуйста, дайте мне знать, если я что-то упустил

Спасибо

Отредактировано:

Функция сохранения данных загружается в двух местах: 1- приложениечто я разрабатываю сканирование QR-кодов, поэтому сохранение данных вызывается в следующей функции:

- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{
.... 
   id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results){
        // EXAMPLE: just grab the first barcode
       break;
    }

    if(!symbol) 
        return;

    // EXAMPLE: do something useful with the barcode data
    theBarcodeString = symbol.data;

    //adding the string to the list

    [data addObject:theBarcodeString];
    [self saveData];
    [mainTableView reloadData];
    [self endText];
    stringLabel.text=theBarcodeString;

...
}

она также вызывается при редактировании данных:

    -(IBAction)editTable{
        UIBarButtonItem *leftItem;
        [mainTableView setEditing:!mainTableView.editing animated:YES];
        if (mainTableView.editing) {
            leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(editTable)];
        }
        else {

            leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];

    }

    [self saveData];
    [mainTableView reloadData];

}

1 Ответ

1 голос
/ 30 ноября 2011

Вам необходимо просмотреть следующие вызовы:

applicationDidEnterBackground
applicationWillEnterForeground
applicationDidBecomeActive
applicationWillTerminate

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

...