在ViewDidLoad之后丢失NSArray的内容

时间:2013-06-20 15:55:17

标签: iphone objective-c

我正在开发我的第一个iOS应用程序:一个存储Recipe对象数组的cookbook。数组在头文件中声明如下:

@property (nonatomic, strong) NSArray *recipeArray;

在viewDidLoad方法中,我使用XML文件中的配方填充数组,如下所示:

self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML];

在viewDidLoad方法中,在该行代码之后,我能够成功访问数组的内容。

问题是当我想在prepareForSegue方法中访问数组时,数组似乎是空的。在prepareForSegue方法的开头,我输入了测试输出语句:

NSLog(@"Name called from segue: %@", [self.recipeArray[0] name]);

并打印出“从segue调用的名称:( null)

为什么会这样?如何获取数组的内容以及在viewDidLoad方法完成执行后它们是如何保存的?

2 个答案:

答案 0 :(得分:0)

一个非常常见的初学者错误是拥有一个对象的多个实例,通常是一个视图控制器。如果以编程方式实例化视图控制器,但控制器也在.xib或storyboard文件中指定,则会发生这种情况。例如,如果你在故事板中的两个视图控制器之间连接了一个segue,但你也做了类似的事情:

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.dataFileName = @"TheDataFile.txt";

然后控制器的多个副本很可能是你的问题。您已经实例化了一个并提供了如上所述的数据文件,以及当用户点击按钮或以其他方式激活segue时故事板创建的文件。

尝试在-viewDidLoad方法中放置一个断点,看看每次点击它时self的值(在这种情况下是视图控制器的地址)是否相同。

如果您的问题实际上是由于视图控制器的多个副本,您可能会想知道如果不实例化它,您应该如何设置视图控制器。答案当然是,这正是-prepareForSegue:的用途。在这里你可以告诉新的视图控制器从哪个文件获取数据,或者设置视图控制器以便它可以完成它的工作。

答案 1 :(得分:-1)

我认为你必须像你这样制作NSArray的可变副本

NSArray *array = [[NSArray alloc]initWithArray:arrayFromXML];

self.recipeArray = [array mutableCopy];

然后尝试在prepareForSegue方法中使用此recipeArray。我想你会在viewDidLoad中得到数组的内容。

祝你好运!!!