【问题标题】:How to use the values from an array defined in another class如何使用另一个类中定义的数组中的值
【发布时间】:2013-02-19 15:15:54
【问题描述】:

我按照 John Wordsworth 的教程 (http://www.johnwordsworth.com/2011/10/adding-charts-to-your-iphone-ipad-app-using-core-plot/) 使用 CorePlot 生成了折线图。

后来我决定从一个网站获取一些 JSON 数据,以便将其用于我的图表。

所有的url连接方法都在我的ViewController.m文件中执行。我在那里创建了一个名为 indicator 的 NSArray,其中包含所有 JSON 数据。

我的问题是图形的所有参数都定义在一个名为 SimpleScatterPlot.m 的单独 NSObject 类中,我想使用字符串数组“indicator”(在ViewController.m 中定义)来自定义 x-轴标签。

我需要做什么才能在SimpleScatterPlot.m 中使用这个 JSON 数据数组?
我试过#import "ViewController.h",但没有解决。

提前感谢您能给我的任何指导。

【问题讨论】:

  • 您必须创建viewController 的实例才能在SimpleScatterView 中访问其ivar
  • en.wikipedia.org/wiki/Objective-C 阅读。您可以使用:1. 属性 2. 返回对象的方法 3. 获取所需实例的单例 5. 协议 6... 取决于您的要求...

标签: ios objective-c nsarray core-plot


【解决方案1】:

不确定我是否理解正确,但我认为您没有尝试从 SimpleScatterView.m 访问指标 nsarray,而是从 ViewController.m 中设置值。

1) 在 SimpleScatterView.m 中定义一个 public NSArray 并合成它。

2) 不要尝试获取访问权限,而是使用 ViewControler.m 中的“prepareForSegue”在destinationSegueController 中设置指示器。

3) 在 SimpleScatterView.m 中实现“-(void)setIndicator:(NSArray *)indicator”并根据需要更新 GUI。

虽然“模型 - 视图 - 控制器”范式建议不要使用 ViewController 来执行通信等,但那是为了另一个线程。

【讨论】:

  • 我正在构建的项目是一个单视图应用程序,其中包含一个包含 SimpleScatterPlot 的 UIView。所以没有涉及到任何转折。
【解决方案2】:

在 Viewcontroller 中创建一个属性并合成它。然后将 JSON 数据传递给属性。

To access the array in SimpleScatterView.m:
    Viewcontroller *viewcontrol = [[ViewController alloc] init];
    You can then access the array by using viewcontrol.indicator.
    NSLog(@"%@",viewcontrol.indicator);

【讨论】:

  • 我试过这个,但是当我尝试构建项目时出现错误。我相信为了使用您提供的代码,我必须#import“ViewController.h”。问题是,我的代码已经将 SimpleScatterPlot.h 导入到 ViewController.h... 似乎是多余的,我认为这是我导致错误的原因。
【解决方案3】:

如果我没有读错您要执行的操作,我的猜测是您可以在 UIViewController 视图中适当地使用 SimpleScatterView(这是,假设 SimpleScatterView 实际上是 UIView) .

在这种情况下,当您的控制器已下载其数据时,您可以实例化 SimpleScatterView 并通过将其添加到您的视图控制器 view 来显示它。

... <data has been downloaded> ...
SimpleScatterView* scatterView = [[SimpleScatterView alloc] initWithFrame:...];
[self.view addSubview:scatterView];

当您初始化SimpleScatterView 时,您可以将一个对数据数组的引用传递给它(例如,在其自定义的init 方法中,或使用一个属性)。例如:

SimpleScatterView* scatterView = [[SimpleScatterView alloc] initWithFrame:... andData:(NSArray*)...];

或:

scatterView.dataSet = <your_json_array>;

当然,对于这种设计,您有很多替代方案。具体来说,我会提到:

  1. 使用模型类处理所有数据的可能性,这样控制器将数据写入模型,而绘图视图从中读取数据。在这种情况下,该模型可以通过单例实现,以便于访问;

  2. 为绘图视图使用“数据源”的可能性:这需要在视图和它的数据源之间定义一个协议(例如,getData 方法);您的视图控制器将扮演数据源的角色(换句话说,不是像上面的示例那样将数组传递给绘图视图,而是传递对控制器的引用,视图将访问其数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多