Ios 在ViewController之间共享JSON数据?
我对编程基本上是新手,所以请原谅我的无知。如果有人能给我指出正确的方向,我将不胜感激 我遵循了AFNetworking()的教程,并在我自己的项目中使用它从web解析JSON 我还没有弄清楚如何将数据传输到不同的UIViewController。我已经看到和其他相关的问题都没有用 我尝试过使用委托和协议/singleton/GlobalVariables/referencengclasses,我可以让它们用于其他与JSON无关的材料,当我记录值时,它总是空的。(JSON数据也将发生变化,我在某处读到一些选项是不可变的) 在我看来,本教程似乎使用自定义NSDictionary类来存储JSON数据,并使用prepareForSegue传递数据:但据我所知,这是一种仅用于情节提要的方法。我正在使用nib文件。我应该把我的整个项目转换成故事板风格,还是有办法用Nibs/Xibs实现这一点 感谢您抽出时间阅读此文章。我最不想做的事就是问你一个问题,但我已经被困了一段时间了 编辑:我已在执行请求的ViewController上检索到JSON数据,但它不会转移到其他ViewController,我觉得在我需要的每个新控制器上请求JSON数据是一种不好的做法 EDIT2这里是一些代码(如果你愿意,我可以发布更多)Ios 在ViewController之间共享JSON数据?,ios,objective-c,json,nsdictionary,afnetworking,Ios,Objective C,Json,Nsdictionary,Afnetworking,我对编程基本上是新手,所以请原谅我的无知。如果有人能给我指出正确的方向,我将不胜感激 我遵循了AFNetworking()的教程,并在我自己的项目中使用它从web解析JSON 我还没有弄清楚如何将数据传输到不同的UIViewController。我已经看到和其他相关的问题都没有用 我尝试过使用委托和协议/singleton/GlobalVariables/referencengclasses,我可以让它们用于其他与JSON无关的材料,当我记录值时,它总是空的。(JSON数据也将发生变化,我在某处
-(void)jsonData {
NSLog(@"Loading JSON...");
NSURL *url = [NSURL URLWithString:@"http://fillerCode.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"station",@"1",@"previous_song", nil];
NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"/scripts/MoreFillerCode" parameters:params];
AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest: request
// JSON SUCCESS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Getting Next Song...");
self.get_next_song = (NSDictionary *)JSON;
RightViewController *rightViewController = [[RightViewController alloc] init];
rightViewController.get_next_song = self.get_next_song;
[self updateViewStuff];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Data"
message:[NSString stringWithFormat:@"%@",error]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
NSLog(@"Operation Failed");
}];
[operation start];
NSLog(@"JSON Operation Started");
}
-(无效)jsonData{
NSLog(@“加载JSON…”);
NSURL*url=[NSURL URLWithString:@”http://fillerCode.com"];
AFHTTPClient*httpClient=[[AFHTTPClient alloc]initWithBaseURL:url];
NSDictionary*参数=[NSDictionary Dictionary WithObjectsSandKeys:@“1”,“station”,“1”,“previous_song”,nil];
NSURLRequest*request=[httpClient requestWithMethod:@“POST”路径:@”/scripts/MoreFillerCode“参数:params];
AFJSONRequestOperation*操作=
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
//JSON成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
成功:^(NSURLRequest*请求,NSHTTPURLResponse*响应,id JSON){
NSLog(@“获取下一首歌曲…”);
self.get_next_song=(NSDictionary*)JSON;
RightViewController*RightViewController=[[RightViewController alloc]init];
rightViewController.get_next_歌曲=self.get_next_歌曲;
[自更新视图];
}失败:^(NSURLRequest*请求,NSHTTPURLResponse*响应,NSError*错误,id JSON){
UIAlertView*av=[[UIAlertView alloc]initWithTitle:@“检索数据时出错”
消息:[NSString stringWithFormat:@“%@”,错误]
代表:无
取消按钮:@“确定”
其他按钮:无];
[视听节目];
NSLog(@“操作失败”);
}];
[操作启动];
NSLog(@“JSON操作已启动”);
}
您的主要问题:
我已经在我预先设置的ViewController上检索了JSON数据
请求打开,但不会转移到其他ViewController
出现此问题的原因:
RightViewController *rightViewController = [[RightViewController alloc] init];
rightViewController.get_next_song = self.get_next_song;
[self updateViewStuff];
您正在分配和实例化一个全新的视图控制器,然后在其上设置属性。在此之后,您再也不会提到rightViewController
,它将在完成块结束时解除分配。任何时候你alloc init,你正在创建一个新的,如果你不使用它,将它设置为@property,或者将它推到导航控制器上,它就会消失
我不太了解应用程序的其他部分,无法为您提供修复此问题的代码,但以下是解决此类问题的一般思路:
- 创建一个处理发送/接收数据的新类(NSObject,而不是UIViewController)。把所有的东西都放在这里
- 当视图控制器需要数据时,让它向这个新对象请求数据。数据应返回给视图控制器。对象可以使用保存的数据(如果可用),或者使用AFNetworking(如果不可用)发出请求
这样,您的视图控制器就不需要相互了解—您不需要沿链传递数据,只要在需要时从数据源访问数据即可。如果您想让示例生效,您需要执行以下两个步骤之一:
你确定你得到的JSON响应是有效的/非空的吗?是的,JSON响应在我执行AFJSONRequestOperation的ViewController上工作,但没有其他功能。对不起,我没有澄清。我可以在一个ViewController上从网络上获取图像、标签和音乐。如果您发布相关的AFNetworking代码,这会有所帮助代码>,添加
断言(self.get\u next\u song)代码>,然后运行应用程序,查看是否崩溃。如果在该行崩溃,则表示您的数据为零。如果没有,我们将不得不调查其他情况。此外,1RightViewController*RightViewController 1似乎在此之后未被使用,并将在块退出后被销毁。所以无论1[self updateViewStuff]1做什么,它都与视图控制器无关。非常感谢您抽出时间。我还有很多事情要做。因此,我应该将此代码段放在NSObject中,而不是放在它现在所在的位置,并在UIViewController需要数据时简单地引用它?我看看是否有效。是的。这只是一种方法,但一般来说,下载和解析数据不属于c视图