我正在开发我的第一个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方法完成执行后它们是如何保存的?
答案 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中得到数组的内容。
祝你好运!!!