在开始使用其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编程。
答案 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中,引入了一种新的出列方法: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