Ios 以编程方式创建UITableViewCell

Ios 以编程方式创建UITableViewCell,ios,uitableview,uiscrollview,nsstring,Ios,Uitableview,Uiscrollview,Nsstring,我正在尝试创建一个UITableView单元格,其中包含一个UIScrollView,该单元格能够为UITableView中的每个单元格水平滚动 一切显示正确,工作正常。但是,当我在UITableView上不断上下滚动时,内存使用率会不断上升上升。。。。。我认为这意味着,在重用UITableViewCell时,我会不断地在每个单元上添加自定义元素。我想知道我怎样才能阻止这一切的发生 这是我的密码: - (UITableViewCell *)tableView:(UITableView *)tab

我正在尝试创建一个
UITableView单元格
,其中包含一个
UIScrollView
,该单元格能够为
UITableView
中的每个单元格水平滚动

一切显示正确,工作正常。但是,当我在
UITableView
上不断上下滚动时,内存使用率会不断上升上升。。。。。我认为这意味着,在重用
UITableViewCell
时,我会不断地在每个单元上添加自定义元素。我想知道我怎样才能阻止这一切的发生

这是我的密码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Configure the cell...
    NSDictionary *cellDictionary = [xmlMArray objectAtIndex:indexPath.row];

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // code
    codeString = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 0.5, 70.0, 40.0)];
    codeString.text = [cellDictionary objectForKey:@"Code"];
    codeString.backgroundColor = [UIColor clearColor];
    // series
    addressString = [[UILabel alloc] initWithFrame:CGRectMake(220.0, 10.5, addressString.frame.size.width, 50.0)];
    addressString.text = [NSString stringWithFormat:@"PC %@: %@",[cellDictionary objectForKey:@"Number"] ,[cellDictionary objectForKey:@"Street"]];
    [addressString sizeToFit]; // Dynamic UILabel width
    addressString.backgroundColor = [UIColor clearColor];

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    UIScrollView *scrollCell  = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
    [scrollCell setContentSize:(CGSizeMake((220.0 + addressString.frame.size.width)+15, cell.frame.size.height))];

    [scrollCell addSubview:codeString];
    [scrollCell addSubview:addressString];
    [cell addSubview:scrollCell];

    return cell;
}

这里似乎有两个问题。我将尝试解释实际发生的情况,但您应该遵循mbm29414的答案

在该方法的第一部分中,您使用标识符请求一个
UITableViewCell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
下一部分是检查您是否收到此呼叫的手机:

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                    reuseIdentifier:CellIdentifier];
}
这意味着,如果您的第一行代码没有返回单元格对象,那么您正在实例化一个新的单元格对象

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

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                reuseIdentifier:CellIdentifier];
UIScrollView *scrollCell (...)
这样的话,你可能不会真的重用细胞,我不确定。至少,它不应该在那里。每次您可能会分配两倍的空间。 删除最后一个实例化,这可能会有所帮助

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

  • 创建单元
  • 创建2个UIL标签
  • 创建滚动视图
  • 将标签添加到ScrollView的子视图
  • 将scrollView添加到单元格的子视图
  • 用快乐的方式发送手机
当您的单元格在
[tableView DequeueReusables..]
期间死而复生时,它们仍然包含带有UILabel的UIScrollView。您的代码没有利用这一点,而是忽略了它。这意味着您要在单元格中添加一个附加的带有标签的滚动视图。如果你经常上下滚动,这意味着一个单元格可能包含50个不同的滚动视图,所有这些视图的处理量相同

接下来就是这样:

  • 从队列中获取单元格
  • (此单元格已包含UICollView和UILabels)
  • 是否仍要添加带有标签的新滚动视图
  • 发送它的快乐方式(现在有2个滚动视图和4个标签)

要解决这个问题,您应该按照mbm29414的建议,创建自己的UITableViewCell子类。这样,您可以说
cell.codeString.text=@“废话”

每次当您重新创建一个新的
UITableViewCell
时,您似乎也在无休止地添加
UIScrollView
UILabel
对象

首先,删除第二个调用:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
第二,尝试子类化
UITableViewCell
,使UI像您喜欢的那样在
init
方法或IB中。然后,创建一个“setup”方法,获取一个对象并相应地配置每个UI元素。这样,您不仅可以回收单元格,还可以避免不断创建更多的
UIView
子类实例。

  • 检查表视图单元格是否由返回 dequeueReusableCellWithIdentifier:为零不是必需的,因为 除非您的标识符出错,否则该方法将不再返回nil。以前(我想是以前) 6)
  • 在代码的后面,您将创建一个新的单元格,并将其分配给最终返回的单元格变量。为什么?您已经创建了一个,因此创建第二个从根本上说是错误的

为什么要第二次分配UITAbleViewCell?(滚动单元格前的行)