关于data source protocol的cellForRowAtIndexPath

转自:http://www.cnblogs.com/geory/archive/2013/02/27/2913618.html

tableVeiw有两种不同的delegate,一个叫delegate,一个叫data source,它们都是protocols。UITableViewController类会自动设置内部tableVeiw的delegate和data source,因此当我们拖出TableViewController,它已经有一个tableVeiw了,子类controller是默认的delegate和data source。这几乎总是你使用tableVeiw的方式。为什么做这个delegation?因为view不能和它们的controller对话,除了通过不可见通讯,也就是protocol,通过protocol可以来回发消息。所以tableVeiw是这个controller的view,它只能回应target action或delegate的对话,UITableViewController有个property指向这个tableVeiw。

要成为动态的,要实现此data source protocol。那么在这个data source protocol里都有什么方法?


有三个要实现的非常重要的方法,一个是表明表里有多少section,二是每个section有多少row,第三个是返回要绘制的每个row的UITableView cell。来看最后一个方法,这是该方法的的样子:

复制代码
- (UITableViewCell *)tableView:(UITableView *)sender cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // get a cell to use (instance of UITableViewCell)
   UITableViewCell *cell;
   cell = [self.tableView dequeueReusableCellWithIdentifier:@“My Table View Cell”];
   if (!cell) { 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                      reuseIdentifier:@“My Table View Cell”];
   }
   cell.textLabel.text = [self getMyDataForRow:indexPath.row inSection:indexPath.section];
   return cell;
}
复制代码

tableVeiw把自己作为第一个参数传递,然后第二个参数是一个indexPath。静态的cell不用实现这个方法。NSIndexPath要做的就是封装section和row,因此它有两个属性,一个叫section,一个叫row,section会告诉你当前是什么section,row会告诉你这个是当前section里的哪个row,因此这个方法只是说,给我一个用来画这个section里的这个row的UITableView。

这个方法中的代码通常有两部分:第一部分,让自己得到一个cell,然后设置cell里的property,tableVeiw有个神奇的方法叫做dequeueReusableCellWithIdentifier,这是为了效率,tableVeiw就像一个管理这些UITableViewCell的池子,当UITableVeiw离开屏幕,它就把它们放进池子,然后其中一个需要去到屏幕上时,它就进入池中找出一个来,这就是它是如何重用它们。当它们进出屏幕,我们只是一直在重用和复位,有关重用,reuse identifier指定了要用的池子的名字,当我们做了xcode原型cell,这里我们键入它的名字,因为当你做一个xcode的原型cell,如果它到达到重用池而池子是空的,比如第一次启动的时候,它会创建一个,并用原型把它放进去,这就是原型cell的作用,当重用池是空的时候,它会填进去,只要它是空的,就由原型的副本填充。所以这个字符串必须和xcode里的一样,如果你想要填充原型的话。如果这里返回nil,会发生什么?我们没有指定与xcode中相同的字符串,因此它不能使用原型副本,所以不能得到任何东西,它返回nil。接着会放些安全代码在这,alloc/init一个cell。

接下来只要设置property,比如cell有个property叫做text label,这里写了个方法getMyDataForRow:inSection:可以用来获取字符串之类的事情。然后返回这个cell。可以有交替的cell机制,但需要两个不同的池。

在tableVeiw中要有多少section和row,它有两个简单的方法,问它的data source这个tableVeiw里有多少section和这个section里有多少row,你只要回答这些问题:

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

通常是没有section的,也就是整体就是一个大的section。但是section里的row数量没有默认值,你必须给出section有多少row。静态表不必实现任何这些方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值