2015-05-08 3 views
-1

Я хочу, чтобы мое приложение работало так, что когда пользователь нажимает кнопку «Сохранить», будет сохранен NSMutableArray строк (массив называется «имена»), введенный из текстового поля. Естественно, я также хочу, чтобы иметь возможность загружать NSMutableArray в любое время, когда я закрываю/открываю приложение.Сохранение и загрузка NSMutableArray

Прямо сейчас моя кнопка сохранения - это «Сохранить» IBAction. Поэтому в моем файле реализации у меня есть:

- (IBAction)save:(id)sender 
{ 
    NSArray *paths = NSSearchPathforDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex:0]; 
    NSString *fileName = [NSString stringWithFormat:@"%@/myArray", docDir]; 
    [NSKeyedArchiver archiveRootObject:names toFile:fileName]; 
} 

Прежде всего, похоже ли это, что он должен работать? Поскольку несколько раз мое приложение разбилось, когда я пытался, нажмите кнопку «Сохранить». Во-вторых, правильно ли я создаю путь к файлу в IBAction? Или я должен создавать его где-то еще (например, в viewDidLoad)?

Во-вторых, как и где я должен загружать сохраненный NSMutableArray («имена»)?

Большое спасибо!

+0

1. Обработка данных должна осуществляться в классе модели данных, она не является частью пользовательского интерфейса. 2. Что такое 'names', он полностью совместим с NSCoding? 3. +10 для использования 'NSKeyedArchiver', а не' NSUserDefaults'! – zaph

+0

@ Zaph "names" - это имя созданного мной NSMutableArray (в другом месте моего кода), который содержит различные строки, введенные пользователем. Это своего рода глупый вопрос, но просто для того, чтобы уточнить: так что я не должен иметь этот код под IBAction? – Julia

+0

Какова фактическая информация о сбое/трассе? Код выглядит нормально на первый взгляд, но, возможно, он не пишет файл, возможно, в массиве есть объект, который на самом деле не является строкой и т. Д. Ошибка должна помочь. Также согласитесь с @zaph -> сериализовать где-то в другом месте (но это не причина ошибки). (Может быть, экономия даже не связана с этим методом?) – KirkSpaziani

ответ

0

Вам не хватает нескольких понятий здесь, во-первых, как уже сказал Zaph, вы уверены, что объекты names соответствуют протоколу NSCoding?
Если да те строки кодов должны сделать трюк:

- (IBAction)save:(id)sender { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = paths.firstObject; 
    // Add to the path a new directory just to keep things ordered 
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"AppData"]; 
    // If the directory doesn't exist it creates one 
    if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) { 
     NSError *error; 
     [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error]; 
     if (error) { 
      NSLog(@"Error creating directory %@",error.localizedDescription); 
     } 
    } 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:@"names.arc"] ; 
    //Check if the file alredy exist, if does we remove it or the file manager will trigger an error (it doesn't overwrite automatically) 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
     [[NSFileManager defaultManager] removeItemAtPath:path error:nil] ; 
    } 
    // Pass the object that you want to archive, if it is a collection the object inside must support NSCoding protocol 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:<#ObjectsConformToNSCoding#>]; 
    // Saving to the path 
    [data writeToFile:path atomically:YES]; 

} 


[UPDATE]
Как отметил Zaph все ошибки должны быть обработаны правильно или плохое может случиться.

+0

Проверьте код, он неправильно обрабатывает ошибки, если каталог не существует и не может быть создан. Лучше использовать '- writeToFile: options: error:' потому что он имеет параметр 'error'. – zaph

+0

@ Zaph, вы правы, но я написал только для «образцового» намерения. – Andrea

+0

Большое вам спасибо! Но я все еще получаю точку останова в строке «NSArray * paths» – Julia

0

Сообщение: «Тема 1: точка останова 3.1» указывает, что программа попала в точку останова. Точку прерывания можно установить случайно или намеренно, щелкнув номер строки в редакторе Xcode. Точки останова используются, чтобы остановить выполнение программы, чтобы позволить разработчику проверить состояние выполнения в этой точке. Затем программа может быть возобновлена.

Точка останова не является крахом.

Также стрелка синего цвета над номером линии является индикатором точки останова. Вы можете удалить его, перетащив его вправо или отключить, нажав (он будет тусклым) или просто продолжит («Отладка меню: продолжение»).

Чтобы увидеть все точки останова, посмотрите на навигатор точки останова: Command-7.

Стоит отметить чтение документации Xcode WRT для отладки.

+0

Ты рок! Спасибо!!! – Julia

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