Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ViewDidLoad后丢失NSArray的内容_Iphone_Objective C - Fatal编程技术网

Iphone ViewDidLoad后丢失NSArray的内容

Iphone ViewDidLoad后丢失NSArray的内容,iphone,objective-c,Iphone,Objective C,我正在开发我的第一个iOS应用程序:一个存储配方对象数组的烹饪书。数组在头文件中声明如下: @property (nonatomic, strong) NSArray *recipeArray; self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML]; 在viewDidLoad方法中,我使用XML文件中的配方填充数组,如下所示: @property (nonatomic, strong) NSArray *recipeAr

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

@property (nonatomic, strong) NSArray *recipeArray;
self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML];
在viewDidLoad方法中,我使用XML文件中的配方填充数组,如下所示:

@property (nonatomic, strong) NSArray *recipeArray;
self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML];
在viewDidLoad方法中,在这行代码之后,我能够成功地访问数组的内容

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

NSLog(@"Name called from segue: %@", [self.recipeArray[0] name]);
然后打印出“从segue调用的名称:(空)


为什么会发生这种情况?我如何获取数组的内容,以及为什么在viewDidLoad方法完成执行后它们不会被保存?

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

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

self.recipeArray = [array mutableCopy];
然后尝试在prepareForSegue方法中使用此recipeArray。我认为您将获得viewDidLoad中的数组内容


祝你好运!!!

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

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.dataFileName = @"TheDataFile.txt";
那么控制器的多个副本很可能是你的问题。你已经得到了一个你实例化并向上面提供数据文件的副本,以及一个当用户点击按钮或以其他方式激活segue时故事板创建的副本

尝试在
-viewDidLoad
方法中放置一个断点,并查看
self
的值(在本例中是视图控制器的地址)是否在每次点击时都相同


事实上,如果您的问题是由于视图控制器的多个副本,您可能会想知道如果不实例化视图控制器,您应该如何设置它。答案当然是,这正是
-prepareforsgue:
的用途。在这里,您可以告诉新的视图控制器要获取其数据的文件rom,或以其他方式设置视图控制器,使其可以执行其任务。

如果阵列为空,则会发生崩溃。阵列似乎已被删除(nilled)。您在代码中的其他地方更改了ReciperRay?@TBlue,那么这又为什么会更改任何内容呢?这是我在代码中更改ReciperRay的唯一位置。我在代码中还有其他地方可以访问它,比如在cellForRowAtIndexPath方法中,比如:
code
cell.textLabel.text=[self.ReciperRay][indexPath.row]名称];[cell setRecipeForCell:self.ReciperRay[indexPath.row]];NSLog(@“单元格集的配方:%@,[self.ReciperRay[indexPath.row]名称]);return cell;
code
奇怪的是,它工作得很好视图控制器有多少个实例?一个得到数组,另一个得到segue吗?@Wain是的。有一个RecipeTableViewController,它包含数组和所有配方的表,还有一个RecipeViewController,它是e接收特定配方的详细视图。为什么您认为这会有帮助?属性未定义为可变。这并没有解决问题。prepareForSegue方法期间数组的内容仍然为空。如果这是正确的解决方案,则更容易执行:
self.RecipeArlay=[arrayFromXML mutableCopy];
。不需要浪费中间数组。您在哪里调用performsguewithidentifier方法?除了在情节提要中执行的操作之外,我没有对RecipeTableViewController进行任何实例化