当我将许多UIView作为子视图添加到单元格时,如何使用dequeueReusableCellWithIdentifier?

时间:2013-02-22 06:15:46

标签: iphone uitableview

我有UITableView数据量很大。我每次创建UITableViewCell就像:

 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier]; 

之后我将UIView作为子视图添加到UITableViewCell,例如

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                [button addTarget:self action:@selector(onDocumentLogoTapped:) forControlEvents:UIControlEventTouchUpInside];
                button.frame = imageRect;
                button.tag = indexPath.row;
                [cell addSubview:button];

同样我也添加了UIImageView。问题是我的UITableView变得非常慢,并且由于内存问题,应用程序有时会崩溃。

在向其添加subView时,有人可以建议我使用UITableViewCell的正确方法吗?

3 个答案:

答案 0 :(得分:4)

cellForRowAtIndexPath方法中使用此功能:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

}

答案 1 :(得分:1)

如下所示:

在添加子视图之前,请先删除以前的子视图

for(UIView *sv in [cell.contentView subViews])
{
   [sv removefromsuperview];
}

[cell.contentView addSubview:button];

希望这个帮助!

答案 2 :(得分:0)

我认为如果你去自定义单元格然后你可以使用这个方法

会更好
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

            NSArray *nib;
        static NSString *cellIdentifier= @"cell";

        UITableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];


        if(theCell== nil)
        {
            {
                nib = [[NSBundle mainBundle] loadNibNamed:@"<your custom cell xib name>" owner:self options:nil]; 
            }
            theCell = [nib objectAtIndex:0];

             theCell.selectionStyle = UITableViewCellSelectionStyleBlue;
        }

        UIImageView *imageView=(UIImageView*)[[theCell contentView] viewWithTag:101];
//assuming it has a image view with tag 101 you can use any thing

}