以编程方式创建UITableViewCell

时间:2014-03-09 22:00:12

标签: ios uitableview uiscrollview nsstring

我正在尝试创建一个UITableViewCell,其中包含UIScrollView,可以UITableView中的每个单元格水平滚动。

一切都正确显示并且运作良好。但是,当我在UITableView上不断地上下滚动时,内存使用率会上升和上升.....我认为这意味着当{{I}时,我会不断添加自定义元素。 {1}}正在重复使用。我想知道如何阻止这种情况发生。

这是我的代码:

UITableViewCell

3 个答案:

答案 0 :(得分:1)

这里似乎有两个问题。我会尝试解释实际发生的事情,但你应该按照 mbm29414 的答案来解决该怎么做。

在此方法的第一部分中,您要求使用标识符UITableViewCell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

下一部分是检查您是否收到了此电话的小区:

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                    reuseIdentifier:CellIdentifier];
}

这意味着如果您的第一行代码DID没有返回一个单元格对象,那么您将实例化一个新的代码。

稍后在您的方法中,您将实例化另一个单元格:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                reuseIdentifier:CellIdentifier];
UIScrollView *scrollCell (...)

这样你可能实际上不会重复使用细胞,我不确定。至少,它不应该存在。你可能每次都会分配两倍的空间。 删除最后一个实例,这应该可能有所帮助。

我认为另一个问题是你要将scrollView和UILabels添加到单元格的子视图中。你的生活圈子:

  • 创建单元格
  • 创建2个UILabels
  • 创建ScrollView
  • 向ScrollView的子视图添加标签
  • 将scrollView添加到Cell的子视图
  • 发送单元格的快乐方式

当你的单元格在[tableView dequeueReusable..]期间从死里复活时,它们仍然包含带有UILabel的UIScrollView。您的代码没有利用它,而是忽略它。这意味着您要在单元格中添加带标签的ADDITIONAL scrollView。如果你上下滚动很多,这意味着一个单个单元格可能包含50个不同的scrollViews,所有这些都会进行相同的处理。

接下来会发生这种情况:

  • 从队列中获取单元格
  • (此单元格已包含UIScollView和UILabels)
  • 添加带有标签的新scrollView
  • 以快乐的方式发送(现在有2个scrollViews和4个标签)

要解决这个问题,你应该像mbm29414建议的那样,制作你自己的UITableViewCell子类。这样,您可以说cell.codeString.text=@"blah";

答案 1 :(得分:0)

虽然您每次 重新创建新的UITableViewCell,但您似乎也在无休止地添加UIScrollViewUILabel个对象。

首先,删除第二个电话:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

其次,尝试对UITableViewCell进行子类化,在init方法或IB中使用您喜欢的UI。然后,创建一个“设置”方法,该方法接受一个对象并相应地配置每个UI元素。这样,您不仅可以回收您的单元格,还可以不断创建更多UIView子类实例。

答案 2 :(得分:0)

一些事情。

  • 检查是否返回了表格视图单元格 dequeueReusableCellWithIdentifier:是没有必要的,因为 除非你的标识符出错,否则该方法将不再返回nil。它曾经(我想在iOS之前 6)。
  • 稍后在代码中,您将创建一个新单元格并将其分配给最终返回的单元格变量。为什么?你已经创建了一个,所以创建第二个根本就是错误的。