Чтение и запись в plist (программирование iPhone) - PullRequest
2 голосов
/ 18 ноября 2010

Я пытаюсь реализовать простой пример из «Начальной книги по разработке iPhone 3». Я посмотрел код, но мои данные никогда не сохранялись в файл plist. На самом деле моя карта сайта проекта выглядит следующим образом: всякий раз, когда вы запускаете приложение, оно запускается в TestViewController. На TestViewController есть кнопка. Когда вы нажимаете на кнопку, он выдвигает другой контроллер представления, который является PersistenceViewController, и вот код, который я написал в PersistenceViewController. Мои сомнения: вызывается ли applicationWillTerminate в этом методе? Я так не думаю .. пожалуйста, помогите. Сейчас я учусь сохранять данные.

In .h file #define kFilename @"data2.plist"

 - (NSString *)dataFilePath {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:kFilename];
        return path;
    }

    - (void)applicationWillTerminate:(NSNotification *)notification {
        NSMutableArray *contactFormArray = [[NSMutableArray alloc] init];
        NSLog(@"App Terminate:%d",[contactFormArray count]);
        [contactFormArray addObject:nameField.text];
        [contactFormArray addObject:emailField.text];
        [contactFormArray addObject:phoneField.text];
        [contactFormArray addObject:companyField.text];
        [contactFormArray writeToFile:[self dataFilePath] atomically:YES];
        [contactFormArray release];
    }


    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {

        NSString *filePath = [self dataFilePath];
        if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
            NSArray *contactFormArray = [[NSArray alloc] initWithContentsOfFile:filePath];
            NSLog(@"Did Load:%d",[contactFormArray count]);
            nameField.text = [contactFormArray objectAtIndex:0];
            emailField.text = [contactFormArray objectAtIndex:1];
            phoneField.text = [contactFormArray objectAtIndex:2];
            companyField.text = [contactFormArray objectAtIndex:3];
            [contactFormArray release];
        }

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

    }

Спасибо за любые ценные предложения ...

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

applicationWillTerminate вызывается, когда пользователь выходит из приложения (обычно нажатием кнопки «Домой»).Любой код в этом методе делегата будет выполнен (если это не займет слишком много времени).В вашем случае файл Plist будет сохранен.

Если вы используете iOS 4, нажатие кнопки «Домой» может отправить ваше приложение в фоновый режим (не выход).Если приложение будет убито с помощью отладчика или произойдет сбой, этот метод вызываться не будет.

Дополнительная информация:

В iOS 4 многозадачность включена в проектах Xcode по умолчанию.Это предотвращает вызов метода applicationWillTerminate.Если вы не хотите поддерживать многозадачность, поместите UIApplicationExitsOnSuspend в свой файл MyAppName-Info.plist и установите флажок.Если вы хотите его поддерживать, поместите любой код в метод делегата applicationDidEnterBackground, который вы хотите выполнить, прежде чем приложение перейдет в неактивное состояние.

2 голосов
/ 18 ноября 2010

applicationWillTerminate: не будет вызываться на многозадачных устройствах (iOS4), если приложение приостановлено, а затем уничтожено через многозадачный интерфейс пользователя.По словам Apple: «приложения не знают ни о каких переходах в или из приостановленного состояния».Поэтому, если вы сохраняете что-либо внутри applicationWillTerminate: попробуйте сделать это в applicationWillResignActive:.

0 голосов
/ 18 ноября 2010

Я могу ошибаться, но не нужно ли кодировать applicationWillTerminate в файле Delegate.m приложения, а не в каком-либо другом файле .m?В любом случае, это может не иметь значения из-за приостановленного состояния приложений в iOS 4.

...