繁体   English   中英

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

[英]How many cells are present in a single view for a 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编程。

您应该在if (cell==nil)块之外初始化单元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。 每当一个单元格超出表格视图的范围(即,它从屏幕上消失)时,它将被放入前述的缓存中。

dequeueReusableCellWithIdentifier:开始?

所以,回到您的问题

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

好吧,严格来说,它总是使用它。 只是有时(通常在一开始)它返回nil ,即高速缓存未命中,因此您的实现通过分配新的单元格来处理这种情况。问题就变成了:何时dequeueReusableCellWithIdentifier:何时开始命中高速缓存?

再次,这取决于。 在具有单个标识符的表格视图的情况下,很有可能一旦第一个单元格从屏幕上消失(因此将其插入到缓存中),缓存就会被命中。 因此,如果当前正在显示12个单元格并开始滚动,则第13个单元格可能会从头开始分配,因为第1个单元格仍然可见,但是第14个单元格可能会重用第一个单元格,而第1个单元格已经不在屏幕上了。

让这个东西复杂化

但这是一个非常简单的情况。 从理论上讲,您永远无法访问缓存。 假设您做的事情很奇怪(不是很聪明),并且为表中的每个单元动态定义了一个标识符。 在这种情况下,将不会重复使用任何单元格,从而导致滚动中的性能下降。

结论

底线是,您的问题没有一个简单的答案。 这取决于您正在使用的视口,像元高度,不同像元标识符的数量等等。 此外,我们不完全了解缓存的实现方式,因此可能还有其他因素我们无法考虑。

希望能回答您的好奇心。

在iOS 6上还有一件事

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

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

为了注册一个笔尖/类,您可以在Interface Builder中定义一个原型单元(常用的方法),也可以通过调用registerNib:forCellReuseIdentifier:registerClass:forCellReuseIdentifier:来编程地完成。

如果找不到具有所需标识符的笔尖/类,将引发异常。

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

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

因为您使用dequeueReusableCellWithIdentifier ,所以当您滚动视图时,顶部单元格将位于底部。 因此,请根据您的条件设置文本标签,以测试单元格是否为零

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM