Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.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
Ios 在ViewController之间共享JSON数据?_Ios_Objective C_Json_Nsdictionary_Afnetworking - Fatal编程技术网

Ios 在ViewController之间共享JSON数据?

Ios 在ViewController之间共享JSON数据?,ios,objective-c,json,nsdictionary,afnetworking,Ios,Objective C,Json,Nsdictionary,Afnetworking,我对编程基本上是新手,所以请原谅我的无知。如果有人能给我指出正确的方向,我将不胜感激 我遵循了AFNetworking()的教程,并在我自己的项目中使用它从web解析JSON 我还没有弄清楚如何将数据传输到不同的UIViewController。我已经看到和其他相关的问题都没有用 我尝试过使用委托和协议/singleton/GlobalVariables/referencengclasses,我可以让它们用于其他与JSON无关的材料,当我记录值时,它总是空的。(JSON数据也将发生变化,我在某处

我对编程基本上是新手,所以请原谅我的无知。如果有人能给我指出正确的方向,我将不胜感激

我遵循了AFNetworking()的教程,并在我自己的项目中使用它从web解析JSON

我还没有弄清楚如何将数据传输到不同的UIViewController。我已经看到和其他相关的问题都没有用

我尝试过使用委托和协议/singleton/GlobalVariables/referencengclasses,我可以让它们用于其他与JSON无关的材料,当我记录值时,它总是空的。(JSON数据也将发生变化,我在某处读到一些选项是不可变的)

在我看来,本教程似乎使用自定义NSDictionary类来存储JSON数据,并使用prepareForSegue传递数据:但据我所知,这是一种仅用于情节提要的方法。我正在使用nib文件。我应该把我的整个项目转换成故事板风格,还是有办法用Nibs/Xibs实现这一点

感谢您抽出时间阅读此文章。我最不想做的事就是问你一个问题,但我已经被困了一段时间了

编辑:我已在执行请求的ViewController上检索到JSON数据,但它不会转移到其他ViewController,我觉得在我需要的每个新控制器上请求JSON数据是一种不好的做法

EDIT2这里是一些代码(如果你愿意,我可以发布更多)

-(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(如果不可用)发出请求

这样,您的视图控制器就不需要相互了解—您不需要沿链传递数据,只要在需要时从数据源访问数据即可。

如果您想让示例生效,您需要执行以下两个步骤之一:

  • 在@interface中声明您的RightViewController,并在初始化对象、设置属性然后进行segue时引用该声明

  • 在创建RightViewController对象的同一块中创建segue,否则将失去对它的引用


  • 你确定你得到的JSON响应是有效的/非空的吗?是的,JSON响应在我执行AFJSONRequestOperation的ViewController上工作,但没有其他功能。对不起,我没有澄清。我可以在一个ViewController上从网络上获取图像、标签和音乐。如果您发布相关的AFNetworking代码,这会有所帮助,添加
    断言(self.get\u next\u song),然后运行应用程序,查看是否崩溃。如果在该行崩溃,则表示您的数据为零。如果没有,我们将不得不调查其他情况。此外,1RightViewController*RightViewController 1似乎在此之后未被使用,并将在块退出后被销毁。所以无论1[self updateViewStuff]1做什么,它都与视图控制器无关。非常感谢您抽出时间。我还有很多事情要做。因此,我应该将此代码段放在NSObject中,而不是放在它现在所在的位置,并在UIViewController需要数据时简单地引用它?我看看是否有效。是的。这只是一种方法,但一般来说,下载和解析数据不属于c视图