在Apple提供的SimpleStocks示例代码中,dataSource的定义如下:
property (nonatomic, weak) IBOutlet id <APLSimpleStockViewDataSource> dataSource;
然后使用如下(仅2个示例,但代码中有更多)
NSInteger dataCount = [self.dataSource graphViewDailyTradeInfoCount:self];
NSArray *sortedMonths = [self.dataSource graphViewSortedMonths:self];
我理解graphViewDailyTradeInfoCount的作用,以及graphViewSortedMonths.I我会理解:NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount:self];
(尝试过,我想我知道为什么不起作用)
这就是问题:我读取第一行代码的方式,dataSource正在发送消息graphViewDailyTradeInfoCount(它返回一些指定发生了多少事务的数值)。如果我们假设25个交易,基本上是[dataSource 25]; 而现在我的思绪令人难以置信,因为我强烈期待某个地方,会有代码告诉dataSource如何处理正在发送的数据。但是没有!!!
然后令人难以置信的增加了一个数量级:dataSource已经发送了25,它现在返回并将其放入dataCount。它是如何知道的那样,在任何地方我都找不到代码。
现在,让我弹跳,在第二行代码中,dataSource知道接受(然后返回)一个NSArray。
在我日益稀有的理智时刻,我认为dataSource除了“传递”它所传递的东西之外什么都不做。计算机不能做魔术,感觉就像一个功能,但它在哪里记录?
谢谢!
答案 0 :(得分:1)
这是一个问题:我读取第一行代码的方式,dataSource正在发送消息graphViewDailyTradeInfoCount(返回一些指定发生了多少事务的数值)。
正确。
如果我们假设25个交易,主要是[dataSource 25];
不正确(基于[]和您的描述,您认为我们正在向数据源发送25)。
通话结束后,dataCount = 25
。
调用是要求数据源将数据返回给我们。它将自己传递给数据源(:self
)以供参考,但请求的目的是从数据源获取信息。
现在我们有25个(存储在dataCount
中)我们可以用它做点什么。
同样,在第二行代码中,数据源只是返回数组。我们没有将它传递给数组。
对于之前的迷你问题:
NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount:self];
这不起作用,因为APLStockViewController
是一个类。我们需要与类的实例(self.dataSource
进来的地方)进行对话。
答案 1 :(得分:0)
我认为您可能会过度复制委托和数据源的工作方式。 Datasource指向某个对象的某个实例。
当某个对象表示它是APLSimpleStockViewDataSource
时,它说它实现了一些方法,包括graphViewDailyTradeInfoCount:
和graphViewSortedMonths:
。该对象在其创建的某个位置具有SomeInstanceOfAPLSimpleStockView.datasource = self
(或者您正在处理的类的名称),例如init
或viewdidload
就像你有一些一样
实现这些方法的MyObject* myobj
,您调用了[myobj graphViewSortedMonths:self