我正在开展一个项目,以了解更多有关JSON和restkit的信息。这一切都很好,但是我遇到了一个失去它值的阵列的麻烦。
这是我的网络请求中执行的最后一个方法。
SHRetrieveStoresWS.m
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
self.stores = [[NSArray alloc] initWithArray:objects];
StoresViewController *viewController = [[StoresViewController alloc] init];
[viewController didLoadObjects:objects];
for (Store *aStore in stores) {
NSLog(@"%@", [aStore longName]);
}
}
在我的视图控制器中调用此方法。
StoresViewController.m
@property (strong, nonatomic) NSArray *data;
- (void)didLoadObjects:(NSArray *)aArray
{
NSLog(@"%d", aArray.count);
self.data = [[NSArray alloc] initWithArray:aArray];
NSLog(@"%d", data.count);
[self.tableView reloadData];
}
当我在此方法中询问值时,值是正确的,但数组后面会立即显示0个对象。我在这里错过了什么吗?
我稍后用这种方法检查值。
- (IBAction)pushMe:(id)sender
{
NSLog(@"Data: %d", self.data.count);
}
答案 0 :(得分:1)
你应该传递segue中的数据......
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString: @"MY_IDENTIFIER"]){
StoresViewController *viewController = segue.destinationViewController;
[viewController didLoadObjects: objects];
}
}
这对你有用!只需将MY_IDENTIFIER更改为您的segue的标识符即可。
答案 1 :(得分:0)
问题很可能是您正在创建StoresViewController的多个实例,而不是为您的网络控制器提供对原始实例的引用。
您可以在self
中打印-viewDidLoad
并在didLoadObjects:
中再次打印出来,向自己展示。你会看到指针地址不同。
这条线是罪魁祸首:
StoresViewController *viewController = [[StoresViewController alloc] init];
不是再次实例化StoresViewController,而是向SHRetrieveStoresWS类添加一个属性,并使用它来保存对视图控制器的引用。
@property (strong) StoresViewController *viewController;
您需要在调用-didLoadObjects:
之前设置该属性。
答案 2 :(得分:0)
StoresViewController初始化为局部变量,只能在声明它的方法(aka objectLoader)中访问。在objectLoader完成后,局部变量不再有效。