2013-04-27 3 views
0

Новое в iOS и застряло в одной проблеме в отношении добавления объектов в NSMutable Array и отображения массива на другом представлении в приложении. Данные отображаются отлично в другом представлении в TableView, но когда я добавляю в Array другой элемент (используя код ниже), он просто заменяет то, что было там, а не добавляет в массив.NSMutableArray Добавить и сохранить объекты

- (void) postArray { 
tableData = [[NSMutableArray alloc] initWithCapacity:10]; 
tableData = [[NSMutableArray alloc] initWithObjects: nil]; 
[tableData addObject:favShot]; } 

-(NSString *) saveFilePath { 

NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, TRUE); 
return [[path objectAtIndex:0] stringByAppendingPathComponent:@"savefile.plist"]; } 

- (void) viewWillDisappear:(BOOL)animated: (UIApplication *) application { 
NSArray *values = [[NSArray alloc] initWithObjects:tableData, nil]; 
[values writeToFile:[self saveFilePath] atomically: TRUE]; } 

- (void)viewDidLoad { 

tableData = [[NSMutableArray alloc] initWithObjects: nil]; 

NSString *myPath = [self saveFilePath]; 

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath]; 

if (fileExists) 
{ 

    NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath]; 
    tableData = [values mutable copy]; 
} 

UIApplication *myApp = [UIApplication sharedApplication]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(applicationDidEnterBackground:) 
              name:UIApplicationDidEnterBackgroundNotification 
              object:myApp]; 

[super viewDidLoad]; } 

спасибо.

ответ

0

Каждый раз, когда вы вызываете postArray, вы создаете экземпляр NSMutableArray, а затем отбрасываете его (утечка, если вы не используете ARC). Затем вы создаете еще один экземпляр NSMutableArray. Затем вы добавляете объект (favShot) к этому второму экземпляру.

В следующий раз, когда вы вызываете postArray, он собирается выбросить ваш старый массив и создать 2 новых.

Что вы хотите сделать, это создать экземпляр tableData при создании экземпляра контроллера или при загрузке представления. Затем не устанавливайте tableData = ..., так как это приведет к удалению старого экземпляра. Просто добавьте и удалите объекты.

редактировать

- (void) postArray { 
[tableData addObject:favShot]; 
} 

- (NSString *)saveFilePath { 
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, TRUE); 
return [[path objectAtIndex:0] stringByAppendingPathComponent:@"savefile.plist"]; 
} 

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

[tableData writeToFile:[self saveFilePath] atomically: TRUE]; 
} 

- (void)viewDidLoad { 
NSString *myPath = [self saveFilePath]; 

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath]; 

if (fileExists) 
{ 
    tableData = [[NSMutableArray alloc] initWithContentsOfFile:myPath]; 
} else { 
    tableData = [[NSMutableArray alloc] initWithObjects: nil]; 
} 

UIApplication *myApp = [UIApplication sharedApplication]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(applicationDidEnterBackground:) 
              name:UIApplicationDidEnterBackgroundNotification 
              object:myApp]; 

[super viewDidLoad]; 
} 
+0

Так что я перенес ее в viewDidLoad и я могу добавить больше, чем один, который является огромным шагом вперед. Однако, когда я возвращаюсь к предыдущим представлениям и снова вводите представление, где я снова добавляю массив, этот предыдущий сохраненный массив исчез. Что мне здесь не хватает? – Bachzen

+0

Переместившись к предыдущему виду (предположительно, представленному в контроллере навигации), вы выбрасываете представление (и контроллер), а затем воссоздаете их при навигации по назад. Вам нужно будет сделать что-то вроде записи содержимого массива на диск в viewWillDisappear, а затем перезагрузить его в viewDidLoad. – Wain

+0

Если я сохраню его в .plist, почему бы ему не быть доступным, когда я вернусь к этой точке зрения? Я использовал .plist для сохранения строк в разных представлениях и, похоже, работает. – Bachzen

0

Попробуйте

- (void) viewWillDisappear:(BOOL)animated: (UIApplication *) application 
{ 
    NSString *filePath = [self saveFilePath]; 

    NSMutableArray *savedArray = [NSMutableArray arrayWithContentsOfFile:filePath]; 
    if (!savedArray) savedArray = [NSMutableArray array]; 

    [savedArray addObject:tableData]; 

    [savedArray writeToFile:filePath atomically:YES]; 
} 
+0

спасибо за ответ, он сохраняет, но не решает проблему с сохранением при переходе из представления в режим просмотра – Bachzen

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