【问题标题】:Objective-C, using protocol to access datasourceObjective-C,使用协议访问数据源
【发布时间】:2011-09-13 10:22:41
【问题描述】:

我正在使用 MVC 模型,但我无法获取视图所需的数据,我正在尝试使用数据源,因为视图不应该拥有它的数据。通常,协议用于创建数据源。

  • 我有一个 MVC:CalculatorBrain.[hm] - CalculatorViewController.[hm] -(视图是 .xib)
  • 我也有MVC:GraphingView - GraphingViewController - (模型是我无法获取的数据)

目标是:当我按下计算器上的按钮时,它会绘制当前显示的函数(例如:x+5=)。计算器部分负责表达式/函数、显示等,而图形部分应该绘制。 CalculatorViewController 应该是 GraphingView 的来源,但数据总是保持为空。

这是带有协议声明的 GraphingView.h:

@class GraphingView;

@protocol GraphingViewSource
- (float)getDataPoints:(GraphingView *)requestor;
@end

@interface GraphingView : UIView {
    id <GraphingViewSource> source;
}

@property (assign) id <GraphingViewSource> source;

@end

CalculatorViewController.m 通过实现 getDataPoints: 方法来实现协议。 CalculationViewController.h 头文件:

@interface CalculatorViewController : UIViewController <GraphingViewSource>

按下应该设置数据源的按钮:

- (IBAction)graphPressed:(UIButton *)sender
{
    GraphingViewController *graphingVC = [[GraphingViewController alloc] init];
    graphingVC.graphingView.source = self;
    [self.navigationController pushViewController:graphingVC animated:YES];
    [graphingVC release];
}

按下按钮可以很好地打开新视图等,但以下代码行仅返回 null(在 GraphingView.m 内):

float result = [self.source getDataPoints:self];

看来,我无法访问我的数据源...

【问题讨论】:

  • 使用调试,调用[self.source getDataPoints:self]看到什么?它是进入你的CalculatorViewController,还是source 为零?
  • 我确实没有进入 CalculatorViewcontroller,源是 0x0...
  • 那么graphingVC.graphingView 可能在您设置source 时是nil。是否有为此的 xib 或者您是否在代码中创建视图?
  • 有一个xib,在Interface Builder中添加了一个UIView并将其类设置为GraphingView..

标签: objective-c protocols datasource


【解决方案1】:

从您的 cmets 看来,graphingView 在您尝试设置其来源时是 nil

如果视图控制器有 xib,你应该这样做:

GraphingViewController *graphingVC = [[GraphingViewController alloc] initWithNibName:@"GraphingViewController" bundle:nil];

而不是普通的init

这将创建并实例化所有视图对象,以便在呈现视图控制器之前设置它们的属性。

【讨论】:

  • graphingView 在尝试设置它的源时仍然是空的。
  • 那么您可能没有在界面生成器中正确连接它的插座。
  • 我可以在 GraphingViewCalculator 中设置 viewDidLoad: 中的源,但我需要与 CalculatorViewController 完全相同的对象,创建一个新对象将不起作用...编辑:注意到您的评论为时已晚,现在检查 IB
  • 那么您可能还需要将源设置为 GraphingViewController 上的属性,然后将其进一步传递给视图本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2012-06-10
  • 2014-12-15
  • 2011-06-05
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多