iPhone добавляет в NSMutableArray из другого места, но не сохраняет данные - PullRequest
0 голосов
/ 03 января 2011

Я уже получал помощь отсюда, и благодаря этой помощи я получил ее частично.

Я создал NSMutableArray в файле реализации контроллера представления с именем BookmarksViewController.m.Массив правильно настроен и заполняет UITableView, также содержащийся в том же файле реализации.

Моя первоначальная проблема заключалась в передаче объектов в этот массив из отдельного контроллера представления путем выполнения IBAction для командной кнопки.Когда я передаю строку (addObject) в массив, я также помещаю BookmarksViewController в стек навигации.Когда View Controller загружается в стек навигации, четко переданная строкаОднако всякий раз, когда я перемещаюсь слишком далеко назад через стек навигации, нажимая кнопку «Назад», я возвращаюсь туда, где только что добавил объект, и он полностью исчезает.

Я также использую панель вкладок, на которой есть кнопкаBookmarksViewController.m и если вы нажмете, что новая строка нигде не будет видно.Что я думаю, так это то, что по какой-то причине новая строка не сохраняется после того, как она вышла за пределы навигационной группы, но я не могу понять, как она может, казалось бы, добавить массив в одну перспективу, а не в другую.

Вот соответствующий код:

BookmarksViewController.h

#import <UIKit/UIKit.h>
#import "DissertationAppDelegate.h"

@interface BookmarksViewController : UITableViewController {
    NSMutableArray *bookmarksArray;
    DissertationAppDelegate *dissertationAppDelegate;
}

@property (nonatomic, retain) NSMutableArray *bookmarksArray;

@property (nonatomic, retain) DissertationAppDelegate *dissertationAppDelegate;

@end

BookmarksViewController.m

#import "BookmarksViewController.h"


@implementation BookmarksViewController
@synthesize bookmarksArray;

#pragma mark -
#pragma mark View lifecycle



- (void)viewDidLoad {

bookmarksArray  = [[NSMutableArray alloc]init];
[super viewDidLoad];
}

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

- (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.text = [bookmarksArray objectAtIndex:indexPath.row];
return cell;
}
- (void)dealloc {
[bookmarksArray release];
[super dealloc];
}

Ch01GettingStarted.h

#import <UIKit/UIKit.h>
#import "BookmarksViewController.h"



@interface Ch01GettingStarted : UIViewController {
    IBOutlet UIScrollView *ScrollView;
    IBOutlet BookmarksViewController *bookmarksViewController;
}
-(IBAction) pushChap01Bookmark:(id)sender;

@property (nonatomic, retain) BookmarksViewController *bookmarksViewController;


@end

Ch01GettingStarted.m

#import "Ch01GettingStarted.h"
#import "BookmarksViewController.h"
#import "DissertationAppDelegate.h"

@implementation Ch01GettingStarted
@synthesize bookmarksViewController;

-(IBAction) pushChap01Bookmark:(id)sender{
    [self.navigationController pushViewController:bookmarksViewController animated:YES];
    bookmarksViewController.title = @"Bookmarks";
    [bookmarksViewController.bookmarksArray addObject:@"NewString"];
    NSLog(@"ADD ENTRY");
    [bookmarksViewController.tableView reloadData];
    NSLog(@"RELOAD TABLE");
}

- (void)dealloc {
    [bookmarksViewController release];
    [ScrollView release];
    [super dealloc];
}

Итак, похоже, что он добавляет объект "NewString" в bookmarksArray в BookmarksViewController.Но если возможно, я хочу, чтобы он оставался там все время.

Спасибо.Карл

1 Ответ

0 голосов
/ 03 января 2011

-loadView может вызываться много раз в течение жизни одного UIViewController.Так как вы используете любой существующий массив bookmarksArray с новым массивом каждый раз, когда вызывается -loadView, вы в конечном итоге потеряете данные.

UIViewControllers выгрузит свои представления, если их представление не будет видно, когда контроллер получит предупреждение о памяти.Подробности см. В документации по UIViewController.

Кроме того, вы можете создавать и работать с BookmarksViewController без вызова его метода -loadView, поэтому в текущей реализации bookmarksArray может иметь значение nil при попытке добавить к нему значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...