0

我在 UITableViewDataSource 协议中查看如下消息:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

并且从未完全理解为什么 tableView 部分在开头(这是消息的名称还是参数)。看起来应该是:

- (NSInteger)numberOfRowsInSection:(NSInteger)section 
                      withTableView:(UITableView *)tableView 

tableView:(UITableView *)tableView 代表什么?它被列为参数,但它似乎应该在最后?我在这里想念什么?甚至应该如何阅读?

谢谢任何帮助

4

3 回答 3

4

Objective-C 方法名称与大多数语言中的有点不同,因为方法的参数通常是方法名称的一部分。

您将该方法名称读为“tableView:numberOfRowsInSection:”。它需要两个参数,在方法主体中称为“section”和“tableView”。

表格视图对象是先列出还是最后列出确实是样式问题,但由于它是此消息的“主题”,因此先列出它是有道理的;Objective-C 风格强调可读性,所以这种方法几乎可以读成一句话:“table view has x number of rows in the given section”。

于 2013-06-18T00:24:16.870 回答
2

在 Objective-C 中,方法名称与参数交错。所以这:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

还有这个:

- (NSInteger)numberOfRowsInSection:(NSInteger)section withTableView:(UITableView *)tableView;

在任何一个都可以用于实现相同的最终目标的意义上是等效的,它们是不可互换的。第一个方法的名称(即发送来调用它的消息)是tableView:numberOfRowsInSection:,而第二个是numberOfRowsInSection:withTableView:。正如 mipadi 所提到的,Objective-C 方法通常应该几乎像普通英语一样可读。如果您调用了 method numberOfRowsInSection:ofTableView:,我认为这是一个好名字。无论出于何种原因,这不是最初设计 API 的人选择的约定。

使用 tableView 参数的原因是,如果您有多个 tableView 都具有相同的 dataSource 对象,您可以确定正在询问哪个tableView。

在这个特定的案例中,我相信 tableView 是第一个参数的原因是为了使它更接近地匹配 OS X 上的 NSTableView 的 API,以及 Cocoa 中的其他委托方法,这些方法于 iOS 和 UITableView。为什么决定让 tableView 在 NSTableView 的 API 中排在第一位,这已经被历史遗忘了,但同样,这就是 Apple(实际上是 NeXT)设计它的方式。

于 2013-06-18T00:23:48.827 回答
1

将调用源放在开头是委托方法的常见模式。拥有此参数很重要,因为单个对象可能是多个视图的委托(或在本例中为数据源),并且它需要该参数才能知道代表哪个视图进行了哪些委托方法调用。它是第一个还是最后一个在很大程度上是任意的,没有技术意义。

于 2013-06-18T00:25:51.633 回答