Сохранение массивов приложений для iOS - PullRequest
0 голосов
/ 07 июня 2011

Я хотел бы знать, как сохранить массивы моего приложения для iOS.Я использовал метод, но он сохранился только на моем iPod Touch.Я тестировал на iPad, и он не работал.

Мне нужен код для сохранения массива приложений на любом устройстве ...

Кто-нибудь может мне помочь?

Вот код:

myAppViewController.h:

- (NSString *)GetApplicationDocumentsDirectory;
- (void)applicationWillTerminate:(NSNotification *)notification;

myAppViewController.m:

-(NSString*) GetApplicationDocumentsDirectory {
    static NSString* documentsDirectory = nil;
    if (documentsDirectory == nil) {
        documentsDirectory = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                   NSUserDomainMask,
                                                                   YES)
                               objectAtIndex:0] retain];

    }
    NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory];
    return fullFileName;
}

- (void)applicationWillTerminate:(NSNotification *)notification{
    NSMutableArray *array = [[NSMutableArray alloc] init];
                             [array addObject:lisTitulos];
                             [array addObject:lisImagens];
                             [array addObject:lisData];
                             [array addObject:lisDetalhes];

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
}


- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *filePath = [self GetApplicationDocumentsDirectory];
    //if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    if (array != nil){
        lisTitulos = [array objectAtIndex:0];
        lisImagens = [array objectAtIndex:1];
        lisData = [array objectAtIndex:2];
        lisDetalhes = [array objectAtIndex:3];
    }
    else {
        NSDate *date = [NSDate date];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setLocale:[NSLocale currentLocale]];
        [dateFormat setDateFormat:@"dd/MM/YYYY"];
        NSString *dateNow = [dateFormat stringFromDate:date];

        lisTitulos = [[NSMutableArray alloc] initWithObjects:@"Titulo",nil];
        lisImagens = [[NSMutableArray alloc] initWithObjects:@"0.png",nil];
        lisData = [[NSMutableArray alloc] initWithObjects:dateNow,nil];
        lisDetalhes = [[NSMutableArray alloc] initWithObjects:@"",nil];
    }

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app];
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Спасибо @Deepak.После того, как вы дали мне подсказку о создании журналов оповещений при отладке, я заметил, что iPad убивает приложение, а затем приложение не может вызвать метод applicationWillTerminate:, как вы упоминали ранее.Итак, я решил проблему, изменив свой код на:

- (void)applicationWillTerminate:(NSNotification *)notification{
    [self SavingStatus];
}

-(void)SavingStatus {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:lisTitulos];
    [array addObject:lisImagens];
    [array addObject:lisData];
    [array addObject:lisDetalhes];

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

  ...

    [self SavingStatus];

    return cell;

}

Таким образом, даже если ваше устройство уничтожит приложение до его обычного закрытия, информация все равно будет сохранена = D.

Еще раз спасибо @Deepak и всем, кто мне ответил.

0 голосов
/ 07 июня 2011

Возможно, вы просто отправляете приложение в фоновый режим и не завершаете его.В этом случае applicationWillTerminate: не будет вызван.Это, вероятно, является вероятной причиной, так как остальная часть кода выглядит нормально.

И ваш GetApplicationDocumentsDirectory выглядит немного странно, так как он получает путь к файлу, в котором хранится массив.Кроме того,

NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory];

не является правильным способом получения пути к файлу.Вы должны использовать метод stringByAppendingPathComponent: для documentsDirectory, например,

NSString *fullFileName = [documentsDirectory stringByAppendingPathComponent:@"TarefasSalvas.plist"];

Также имеет смысл объявить fullFileName в качестве статической переменной, а не documentsDirectory.

...