iPhone从另一个位置添加到NSMutableArray但不保留数据

时间:2011-01-03 03:53:21

标签: iphone arrays nsmutablearray

我以前从这里得到了帮助,因为这个帮助我得到了它的部分工作。

我所做的是在名为BookmarksViewController.m的视图控制器实现文件中创建了一个NSMutableArray。数组已正确设置并填充同一实现文件中包含的UITableView。

我最初的问题是通过在命令按钮上执行IBAction,将对象从单独的视图控制器传递到该数组中。当我将字符串(addObject)传递给数组时,我也将BookmarksViewController推送到导航堆栈。当View Controller加载到导航堆栈时,可以清楚地看到传递的字符串。但是,每当我通过按下后退按钮移回导航堆栈太远时,我会返回到刚添加对象的位置,它就完全消失了。

我还使用了一个Tab Bar,它有一个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];
}

所以它似乎正在做的是在BookmarksViewController中向bookmarksArray添加一个对象“NewString”。但如果可能的话,我希望它一直待在那里。

谢谢。 卡尔

1 个答案:

答案 0 :(得分:0)

在单个UIViewController的生命周期中,可能会多次调用

-loadView。由于你每次调用-loadView时都有一个带有新数组的现有bookmarksArray,你最终会丢失数据。

当控制器收到内存警告时,如果视图不可见,UIViewControllers将卸载其视图。有关详细信息,请参阅UIViewController文档。

此外,您可以创建和使用BookmarksViewController而不调用其-loadView方法,因此当您尝试向其添加值时,当前实现bookmarksArray可能为nil。