2

在开始使用它的 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编程。

4

3 回答 3

5

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 个单元格可能会从头开始分配,因为第一个单元格仍然可见,但第 14 个单元格可能会重用第一个单元格,同时它已经离开屏幕了。

让我们把这件事复杂化

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

结论

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

希望能回答你的好奇心。

还有一件事,在 iOS 6 上

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

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

为了注册一个 nib/类,您可以在 Interface Builder 中定义一个原型单元(常用方法),或者通过调用registerNib:forCellReuseIdentifier:或以编程方式完成registerClass:forCellReuseIdentifier:

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

于 2013-06-27T09:15:55.743 回答
1

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

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

于 2013-06-27T10:11:21.003 回答
0

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

于 2013-06-27T09:15:51.520 回答