2011-12-18 3 views
1

Я постепенно изучаю Objective C и iPhone SDK, и мой текущий проект включает в себя создание приложения, в котором хранятся цифровые данные (спортивные данные). Это прежде всего для учебных целей, так как есть несколько приложений, которые делают то же самое. Во всяком случае, я немного ударил. Мое намерение состоит в том, чтобы список игроков хранился в таблице и позволял пользователю добавлять дополнительных игроков.Попытка сохранить/загрузить данные массива в Plist

На данный момент у меня есть кнопка, которая при нажатии на нее добавляется «Ниндзя». Я также включил удаление в таблице. К сожалению, я не могу понять, как сохранить и загрузить данные из plist. Я следил за различными учебниками и руководствами, но я не могу понять, что происходит. Мое подозрение в том, что я загружаю данные из пустого массива и добавляю к этому массиву, но массив, содержащий данные, представляет собой отдельный массив из plist. К сожалению, я немного потерял это.

Данные в моем массиве стираются всякий раз, когда я переключаю виды. Тем не менее, я заметил, что данные остаются, если я уйду и вернусь, но нет, если я уйду на значительное количество времени, уйду и перезагрузив iphone и т. Д. Это, похоже, происходит даже для приложений, на которых я не работал экономии. Это просто функция iPhone, удерживающая данные в случае, если пользователь случайно выходит из программы?

Надеюсь, я объяснил свою проблему несколько ощутимо. TL: версия DR: я хочу добавить данные в массив, сохранить его в plist и перезагрузить данные из plist всякий раз, когда массив присутствует на экране. Код ниже пытается это сделать, но это не удается.

Благодаря

#import "RootViewController.h" 
#import "NewPlayer.h" 
#import "OptionsMenu.h" 

@implementation RootViewController 
@synthesize createdPlayers; 
@synthesize listOfPlayers; 

-(NSString *) pathOfFile{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentFolder = [paths objectAtIndex:0]; 
    return [documentFolder stringByAppendingFormat:@"myfile.plist"]; 

} 


-(void)applicationWillTerminate:(NSNotification*)notification{ 
    NSMutableArray *array = [[NSMutableArray alloc]init]; 
    [array writeToFile: [self pathOfFile] atomically:YES]; 
} 


- (void)viewDidLoad 
{ 

    NSString *filePath = [self pathOfFile]; 
    if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) { 
     NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath]; 
     listOfPlayers.array = [array objectAtIndex:0]; 
     [array release]; 

    } 

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

    [super viewDidLoad]; 
    listOfPlayers = [[NSMutableArray alloc] init]; 

} 


-(IBAction)AddButtonAction:(id)sender{ 
    [listOfPlayers addObject:@"Ninjas"]; 
    [createdPlayers reloadData]; 
} 

-(IBAction)switchView:(id)sender{ 

    OptionsMenu *second = [[OptionsMenu alloc] initWithNibName:nil bundle:nil]; 
    [self presentModalViewController:second animated:YES]; 
} 

-(IBAction)newView:(id)sender{ 
    NewPlayer *second = [[NewPlayer alloc] initWithNibName:nil bundle:nil]; 
    [self presentModalViewController:second animated: YES]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 

    [super viewWillDisappear:animated]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [listOfPlayers count]; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell. 
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15]; 

    cell.textLabel.textColor = [UIColor whiteColor]; 
    cell.textLabel.textAlignment = UITextAlignmentCenter; 

    NSString *cellValue = [listOfPlayers objectAtIndex:indexPath.row]; 
    cell.textLabel.text = cellValue; 

    return cell; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSLog(@"delete section: %d rol: %d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]); 
     [listOfPlayers removeObjectAtIndex:[indexPath indexAtPosition:1]]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 

    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
    } 
} 


-(void)tableView:(UITableView *)listOfPlayers moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{ 
} 

-(void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Relinquish ownership any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 

    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
} 



- (void)dealloc{ 
    [createdPlayers release]; 
    [listOfPlayers release]; 
    [super dealloc]; 
} 

@end 


#import <UIKit/UIKit.h> 

@interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 

    IBOutlet UITableView* createdPlayers; 
    IBOutlet UIButton* superCat; 

    NSMutableArray *listOfPlayers; 

} 

@property(nonatomic, retain) IBOutlet NSObject *listOfPlayers; 

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

-(IBAction)AddButtonAction:(id)sender; 

-(IBAction)switchView:(id)sender; 

-(IBAction)newView:(id)sender; 

@property (nonatomic, retain) UITableView* createdPlayers; 


@end 

Код 20 декабря обновление:

-(NSString *) pathOfFile{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentFolder = [paths objectAtIndex:0]; 
    return [documentFolder stringByAppendingFormat:@"myfile.plist"]; 

} 


-(void)applicationWillTerminate:(NSNotification*)notification 
{ 
    [self.listOfPlayers writeToFile:[self pathOfFile] atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 

} 



- (void)viewDidLoad 
{ 
    self.listOfPlayers = [[NSMutableArray alloc] init]; 

    NSString *filePath = [self pathOfFile]; 
    if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) { 
     NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath]; 
     self.listOfPlayers = array; 
     [array release]; 

    } 

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

    [super viewDidLoad]; 


} 
+0

Возможно, вместо приложения будет прекращено try viewwilldisappear? это может быть что-то глупое, что вызывает проблему, кстати, я вижу код для создания plist, но где вы загружаете его? – Armand

ответ

0

Я не знаю PLIST. Но вы можете попробовать использовать NSData

NSArray *array; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 
//Write data 
[data writeToFile:filePath atomically:YES]; 
//Read data 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSData *oldData = [fileManager contentsAtPath:filePath]; 
NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithData:oldData] 
0

Добро пожаловать в мир программирования iOS. Это очень весело, но это может расстраивать, так же, как программирование на любом языке. Я чувствую твою боль.

Есть целый ряд вещей, которые я вижу:

  1. В viewDidLoad, оказывается, что ваш код, чтобы прочитать файл в массив в порядке, но затем появляется, как будто вы пытаетесь присвойте только первую строку этого массива вашим listOfPlayers. Попробуйте:

    self.listOfPlayers = array; 
    
  2. массив представляет собой массив, и поэтому ваши listOfPlayers. Кроме того, использование self гарантирует, что используется синтезированный сеттер, таким образом сохраняя ваш listOfPlayers при выпуске массива.

  3. В приложенииWillTerminate, я считаю, что вы хотите написать listOfPlayers в файл, но то, что вы на самом деле делаете, это выделение и инициализация пустого массива и запись этого в ваш файл. Попробуйте:

    -(void)applicationWillTerminate:(NSNotification*)notification 
    { 
        [self.listOfPlayers writeToFile: [self pathOfFile] atomically:YES]; 
    } 
    

Я надеюсь, что это помогает!

+0

Я отредактировал свое оригинальное сообщение с фрагментом изменений, которые я сделал. Это давало мне ошибку, и я обновлял вещи. Не уверен, что происходит с NSObject, возможно, не отвечает на проблему WriteToFile. Программа все еще работает, но все еще не сохраняется правильно. Я буду продолжать искать и пробовать вещи. Возможно, я пропустил редактирование или что-то еще. – Dinoberry

0

Там, кажется, что-то неправильно в вашем viewDidLoad

if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) { 
    NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath]; 
    listOfPlayers.array = [array objectAtIndex:0]; 
    . 
    . 

} 
. 
. 
. 
listOfPlayers = [[NSMutableArray alloc] init]; 

Вы обращаетесь listOfPlayers прежде, чем когда-либо выделения его. listOfPlayers.array также неверен

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