UITableViewCell对象变成nil的依据是什么



我问了一个非常基本的问题,怀疑是否属于Tableview,我在没有Storyboard/Xib的情况下以编程方式创建了tableview。它将返回的tableViewnumberOfRowsInSection为14,单元视图完全动态,并且每个单元的高度将彼此不同。

我的问题是tableviewdelegate方法

static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell=(UITableViewCell *)[tableview dequeueReusableCellWithIdentifier:cellIdentifer];
if (cell == nil )
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer];
// how many time entering this loop
}
// ( adding subview to cell view).

cell==nil表示需要进入循环权。根据哪个参数,单元格对象变为零?它会进入多少次,是一次吗?一点也不。

当我检查时,它输入了6次。

如果我使用cellIdentifier,它将输入14次,因为Identifier不同,每次它都会为单元格创建空间,它的右边是因为每个时间名称不同,滚动时会重复使用。

NSString *cellIdentifer= [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row];

它将在此基础上输入6次。为什么不是一次或14次。请说明我做错了什么。因为如果使用@"单元格"标识符,在反复滚动时视图会重叠。如果我使用了第二个单单元格视图对象,则不会重叠&看起来很完美,但设备内存大小会增加

引用人https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/index.html

如果我答对了你的问题,你需要在viewDidLoad方法或loadView中注册你的类,在那里你创建了一个类似[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier];的表视图,以便在表视图中正确重用

代码:1

static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell=(UITableViewCell *)[tableview dequeueReusableCellWithIdentifier:cellIdentifer];
if (cell == nil ){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer];
// how many time entering this loop
}

在上面的代码中,循环将第一次作为表视图中的可见行数执行。之后,它将重用单元格,因为单元格标识符与Cell相同,并且您需要根据indexpath更新单元格数据。

这意味着如果您的表显示6行,那么它将执行6次。更改行高,您可以进行检查。

代码:2

NSString *cellIdentifer= [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row];

对于上面的代码,循环将执行您声明的总行数,因为它将为每个索引路径创建新的单元格。

如果我们给所有单元格指定相同的标识符,则消失单元格将使用出现单元格的内存。但是,如果我们给出不同的标识符,那么每个单元都将有自己的内存位置,并完美地显示数据。

现在假设我们在表视图中有1000条或更多的记录要加载。如果我们给出不同的标识符,那么内存中会有很多分配。这就是重复使用细胞的好处。


为什么6次?

因为,若您提供相同的标识符,表将重复使用单元格。当前可见的最大单元格数,首先分配。然后在滚动时,出现的单元格使用正在消失的单元格的存储位置(单元格出列)。因此,每次滚动时,都不会分配新的单元格。相反,已经分配的单元格被重新使用

为什么是14次?

因为在这种情况下,每个单元格都有不同的标识符。每个单元格都有自己的存储位置。


记住

在单元格nil条件内添加子视图。特定于单元格的内容应在nil条件之外分配。看看下面的代码片段:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
NSString *cellIdentifier = @"MY_CELL";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
/* Everything that is similar in all cells should be defined here
like background colors, label colors, indentation etc. */
}
/* Everything that is row specific should go here
like label text, progress view progress etc. */
return cell;
}

具有相同标识符:

当表单元格将消失时,该单元格将被添加到堆栈中,并且这些单元格是可重用的。

现在,当我们要显示一个单元格时:如果我们使用相同的标识符,那么控制器将检查具有相同标识符的堆栈中的单元格是否可用。

  • 如果是,那么我们将获得一个已经使用的表单元格,并且已经为此单元格设置了UI。所以我们需要在使用之前重置UI。

  • 如果没有,那么它将创建新的单元格并尝试使用它。

在您的情况下,我认为一次可以看到4-5个表单元格,因此它正在创建6个表单元格并重用这些单元格。

使用不同的标识符:在为不同索引路径创建单元格时,堆栈中的表单元格将不可用。因此,它将创造一个新的。因此cell方法将被调用14次。

最新更新