UITableView的单个视图中有多少个单元格?

时间:2013-06-27 09:11:10

标签: iphone ios uitableview

在开始使用其dequeueReusableCellWithIdentifier委托之前,我被问到一个关于表视图的单个视图中有多少个单元格的问题。

我使用了以下程序但它在12行后重置并再次从1开始。

NSMutableArray *array;

-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell==nil){
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];


    NSString *cellValue = [array objectAtIndex:indexPath.row];

    cell.textLabel.text=cellValue;
}

return cell;

}

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [array count];
}

我的viewDidLoad

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


array = [[NSMutableArray alloc]init];

for(int i=1; i<=24 ; i++)
 {   
    NSMutableString *str = [[NSMutableString alloc]initWithString:@"Sachin"];
    NSString *integ = [NSString stringWithFormat:@"%d",i];
    [str appendString:integ];
    [array addObject:str];
 }
}

我的输出屏幕截图位于OutputImage

抱歉这个菜鸟问题。刚刚开始iOS编程。

3 个答案:

答案 0 :(得分:4)

您应该在if (cell==nil)

之外初始化单元格
- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

    static NSString *kCellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];
    }

    NSString *cellValue = array[indexPath.row];
    cell.textLabel.text = cellValue;
    return cell;
}

修改

好的,我会尝试回答你原来的问题。简短的回答是:它取决于。

表格视图,简而言之

首先,这是表视图的工作方式。

在每个数据源调用dequeueReusableCellWithIdentifier。 这个方法的作用是查看缓存并返回带有该标识符的单元格,否则返回nil。 每当一个单元格超出tableview的界限(即它从屏幕上消失)时,它将被放入上述缓存中。

dequeueReusableCellWithIdentifier:什么时候开始?

所以,回到你的问题

  

表格视图的单个视图中有多少个单元格在开始使用其dequeueReusableCellWithIdentifier

之前

嗯,严格来说,总是使用它。有时(通常在最开始时)它返回nil,即缓存未命中,因此您的实现通过分配新单元来处理这种情况 所以问题就变成:dequeueReusableCellWithIdentifier:什么时候开始点击缓存?

再次,这取决于。在具有单个标识符的表视图的情况下,一旦第一个单元格从屏幕上消失(因此被插入高速缓存中),很可能就会触发高速缓存。因此,如果您当前正在显示12个单元格,并且您开始滚动,则第13个可能会从头开始分配,因为第1个仍然可见,但是第14个可能会重复使用第1个,同时它已经脱离屏幕。

让这个东西复杂化

但这是一个非常简单的案例。从理论上讲,你永远不会碰到缓存。假设您做了一些非常奇怪的事情(并且不那么聪明)并且您为表中的每个单元格动态定义了一个标识符。在这种情况下,不会重复使用单元格,导致滚动时性能下降。

结论

最重要的是,你的问题没有一个答案。它取决于您正在使用的视口,单元格高度,不同单元标识符的数量等。此外,我们并不确切知道如何实现缓存,因此可能还有其他因素无法考虑。

希望能回答你的好奇心。

在iOS 6上还有一件事

仅供参考,在iOS 6中,引入了一种新的出列方法:dequeueReusableCellWithIdentifier:forIndexPath

这种方法的主要区别在于从不返回nil。在高速缓存未命中时,它会根据您先前注册的类或nib文件自动创建一个新文件。

为了注册一个nib / class,你可以在Interface Builder中定义一个原型单元格(常用的方法),也可以通过调用registerNib:forCellReuseIdentifier:registerClass:forCellReuseIdentifier:以编程方式进行。

如果找不到具有所需标识符的nib / class,则会引发异常。

答案 1 :(得分:1)

what i was doing using the above program was trying to find out how many cells are created before cell reuse begins.

当您表重新加载数据时(即从显式调用或viewDidAppear之后),表重用此时可用的单元格。因此,如果您有一个空的表视图,它首先使用NEW单元格填充表格,一旦创建了表格并开始滚动,它就会重新使用单元格。

答案 2 :(得分:0)

因为您使用dequeueReusableCellWithIdentifier,当您滚动视图时,顶部单元格将位于底部。 因此,如果您的单元格是nill

,请将您的文本标签设置为您测试的条件