什么基础UITableViewCell对象变为nil

时间:2016-06-01 11:49:46

标签: ios objective-c uitableview

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

我的问题在于tableview delegate方法

     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不同,每次它都会为单元格创建空间,它正确,因为每个时间名称都不同,滚动时会重复使用。“ / p>

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

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

参考https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/index.html

4 个答案:

答案 0 :(得分:0)

如果我正确地提出了您的问题,您需要在viewDidLoad方法或loadView中注册您的类,您可以在其中创建类似[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier];的表视图,以便在tableview中正确重用

答案 1 :(得分:0)

代码: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
}

在上面的代码中,循环将在第一次执行时作为tableview中可见行的数量执行。之后它将重用cell,因为cellIdentifier是相同的Cell,你需要根据索引路径更新单元格数据。

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

代码:2

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

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

答案 2 :(得分:0)

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

现在假设我们在Table-view中加载1000条或更多条记录。如果我们将提供不同的标识符,内存中将有大量的分配。这是重复使用细胞的好处。

  

为什么要6次?

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

  

为什么要14次?

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

<强>记住

在单元格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;
}

答案 3 :(得分:0)

使用相同的标识符:

当表格单元格消失时,这个单元格将被添加到堆栈中,这些单元格可以重复使用。

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

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

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

在你的情况下,我认为4-5表格单元格一次可见,因此它创建了6个表格单元格并重新使用这些单元格。

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