我在UITableViewDataSource协议中查看如下消息:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
并且从未完全理解为什么tableView部分位于开头(这是消息的名称还是一个参数)。看起来应该是:
- (NSInteger)numberOfRowsInSection:(NSInteger)section
withTableView:(UITableView *)tableView
tableView:(UITableView *)tableView代表什么?它被列为一个参数,但它似乎应该在最后?我在这里错过了什么?它应该怎么读?
thx任何帮助
答案 0 :(得分:4)
Objective-C方法名称与大多数语言略有不同,因为方法的参数通常是方法名称的一部分。
您将该方法名称读为“tableView:numberOfRowsInSection:”。它在方法体中需要两个称为“section”和“tableView”的参数。
表视图对象是首先列出还是最后列出是一个风格问题,但由于它是此消息的“主题”,因此首先列出它是有意义的; Objective-C风格强调可读性,因此这个方法几乎可以读作句子:“表格视图在给定的部分中有 x 行数。”
答案 1 :(得分:2)
在Objective-C中,方法名称与参数交错。所以这个:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
和此:
- (NSInteger)numberOfRowsInSection:(NSInteger)section withTableView:(UITableView *)tableView;
在某种意义上是等价的,可以用来实现相同的最终目标,它们是不可互换的。第一个方法的名称(即发送以调用它的消息)是tableView:numberOfRowsInSection:
,而第二个方法是numberOfRowsInSection:withTableView:
。正如mipadi所提到的,Objective-C方法通常应该像普通英语一样可读。如果您调用方法numberOfRowsInSection:ofTableView:
,我会认为这是一个好名字。无论出于何种原因,首先设计API的人都不会选择。
完全拥有tableView参数的原因是,如果您有多个tableView都具有相同的dataSource对象,则可以确定正在询问哪个 tableView。
在这种特定情况下,我认为tableView作为第一个参数的原因是使它更接近OS X上的NSTableView API以及Cocoa中的其他委托方法,其中 long 早于iOS和UITableView。为什么决定让tableView在NSTableView的API中排在第一位,这在历史上是失败的,但同样,这就是Apple(实际上是NeXT)设计它的方式。
答案 2 :(得分:1)
将调用源放在开头是委托方法的常见模式。拥有此参数很重要,因为单个对象可以是多个视图的委托(或者在本例中是数据源),并且需要该参数来知道代表哪个委托方法调用哪个视图。无论是第一个还是最后一个都是武断的,没有技术意义。