0

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

@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 方法完成执行后为什么不保存它们?

4

2 回答 2

0

一个非常常见的初学者错误是拥有一个对象的多个实例,通常是一个视图控制器。如果您以编程方式实例化视图控制器,但控制器也在 .xib 或情节提要文件中指定,则可能会发生这种情况。例如,如果您在情节提要中的两个视图控制器之间连接了一个转场,但您也在执行以下操作:

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

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

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

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

于 2013-06-20T16:31:00.833 回答
-1

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

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

self.recipeArray = [array mutableCopy];

然后尝试在您的 prepareForSegue 方法中使用这个 recipeArray。我想你会像 viewDidLoad 一样得到数组的内容。

祝你好运!!!

于 2013-06-20T16:03:53.713 回答