2013-03-20 3 views
1

В настоящее время я пишу приложение для iPhone, и одним из требований к конструкции, мне нужно, чтобы следовать, следующие:Занесение NSMutableArray из NSObjects в NSUserDefaults

магазин NSObjects в NSMutableArray, отображение данных к UITableView и сохраните данные в NSUserDefaults. Я могу хранить NSObject в NSMutableArray и отображать его в UITableView, но мне нужна помощь, чтобы понять, как хранить данные в NSObject до NSUserDefaults.

Мое определение NSObject (.h):

#import <Foundation/Foundation.h> 
    @interface Name : NSObject 
    @property (nonatomic)NSString *name; 
    @property (nonatomic)NSInteger score; 
    @end 

Моя реализация NSObject (.m)

#import "Name.h" 
    @implementation Name 
    -(id)initWithName:(NSString*)name andScore:(NSInteger)score 
    { 
    _name = name; 
    _score= score; 
    return [super init]; 
    } 
    @end 

Это, как я хранить в моем NSObject:

NSString *newName = _submitNameTextBox.text; 
    NSInteger score = 0; 
    Name *name = [[Name alloc] init];//Name is the object name 
    name.name = newName; 
    name.score = score; 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSMutableArray *listTemp = appDelegate.nameList; //main copy of my list is in app delegate, but i have it accessible by my uiviewcontrollers. 

я добавить NSObjects в моей secondUIViewController, и ди перелистывайте данные в моем третьемUIViewController, в то время как мой первый - это основной экран манипуляции хранящихся данных.

Так что мой вопрос, учитывая код, я использовал, чтобы определить мой NSObject и как я хранить указанный объект в NSMutableArray, как я хранить NSMutableArray в NSUserDefaults на приложение остановов. Идея - это массив, который должен загрузить массив программ с данными из последнего прогона, чтобы пользователь мог отслеживать свои данные.

+0

[[NSUserDefaults standardUserDefaults] setObject: self.arrayOfPDF forKey: @ ""]; [[NSUserDefaults standardUserDefaults] synchronize]; –

+0

Вы не можете сохранять пользовательские объекты в 'NSUserDefaults'. Вам нужно сначала закодировать их в NSData. – rmaddy

+0

Этот метод Init может не делать то, что вы думаете –

ответ

2

Если вам нужно написать массив, содержащий строку, то:

Saving:

[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"ArrayKey"]; 

Reading:

NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"ArrayKey"]]; 

Как вам нужно написать массив, содержащий объекты, вы должны кодировать их и используйте Archiver.

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:array forKey:@"array"]; 
} 

- (id)initWithCoder:(NSCoder *)coder { 
    array=[coder decodeObjectForKey:@"array"]; 
    return self; 
} 


- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    return nil; 
} 

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    yourObject=[NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    NSLog(@"array is ->%@",[yourObject array]); 
    return YES; 
} 
2

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

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:nameList forKey:@"dataArray"]; 
} 

Когда ваши нагрузки App снова, вам необходимо загрузить данные с помощью didFinishLaunchingWithOptions делегата вашего приложения делегата.

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    nameList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"dataArray"]; 
    if(!nameList) 
    { 
     //First time load or data is not saved yet 
    } 
} 
+1

'applicationWillTerminate' не вызывается для большинства приложений. Сохранение при входе в фон было бы лучшим выбором. – rmaddy

+0

Кроме того, это не работает для объектов списка объектов без свойства. – 2013-03-20 05:19:35

+0

@ H2CO3: Я просто ответил на запрос OP о том, «как я могу хранить NSMutableArray в NSUserDefaults при закрытии приложений. Идея - это массив, который должен загружать массив программ данными из последнего запуска, поэтому пользователь может отслеживать его/ее данные. " –

0

Концепция довольно проста. Вы создаете объект класса Name и показываете его в UITableView. Когда вы создаете объект и отображаете его в UiTableView, вы работаете с адресом памяти, вы просто извлекаете живой объект из NSMutableArray, в то время как вы пытаетесь сохранить объект в NSUserDefaults и повторно запускаете приложение, которое вы ничего не получаете, поскольку ссылка будет убит, поэтому вместо этого сохраните данные, помещенные в ваш объект класса, сообщите об этом, String или, Dictionary ..

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