使TableView按钮占用更少的内存

时间:2013-11-16 18:13:27

标签: ios objective-c uitableview

我这里有代码生成包含按钮的单元格列表。

我很确定有一种方法可以让我创建一个按钮对象而不是20,但我不确定如何实现它?

我需要一些关于在哪里制作它的指导,所以我只创建一个按钮对象。

另外,当我只需要1时,我可能会制作20个单元格对象?

我还不完全了解如何充分利用记忆。

我的代码:

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

    NSString *CellIdentifier = @"TimesCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //[cell sizeToFit];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if([cell.contentView viewWithTag:3] != nil){
        [[cell.contentView viewWithTag:3] removeFromSuperview];
    }

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(customActionPressed:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitleEdgeInsets:UIEdgeInsetsMake(-10.0f, 0.0f, 0.0f, 0.0f)];

    button.frame = CGRectMake(5, 5, 310, 50);
    button.tag = 3;

    int rows = [yourDefaultActivities count];
    int rowsl = rows - 1;

    float r = 1+(((255-1+75)/rowsl)*(indexPath.row));

    if(r > 255){
        r = 255;
    }

    float g = 255-(((255-1+75)/rowsl)*(indexPath.row));

    if(g < 0){
        g = 255-fabsf(g);
    }else{
        g = 255;
    }
    float b = 1;

    UIColor *thisColor = [UIColor colorWithRed:r/255 green:g/255 blue:b/255 alpha:1];

    button.backgroundColor = thisColor;

    button.clipsToBounds = YES;
    button.layer.cornerRadius = 15;
    button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
    [button setTitle:[[yourDefaultActivities objectAtIndex:indexPath.row] objectAtIndex:0] forState:UIControlStateNormal];
    [button.titleLabel setTextColor:[UIColor blackColor]];
    [button.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]];

    [cell addSubview:button];

    return cell;
}

编辑:我每次创建一个新按钮时都试图删除按钮,但我一定是做错了..

1 个答案:

答案 0 :(得分:2)

一个按钮对象不能同时出现在8个单元格中 - 您需要随时在屏幕上显示的单元格和按钮(看起来像8或9)。但是带有按钮的8或9个单元格不应该导致任何内存问题 - 按钮并不昂贵。您发布的代码的问题在于,每次调用cellForRowAtIndexPath时都会添加按钮,滚动时会发生很多情况。由于单元格被重用,因此您不希望向已有单元格的单元格添加按钮。在我看来,最简单的解决方案是在故事板中创建一个自定义单元格,并在那里添加按钮。您仍然可以根据indexPath在代码中设置颜色,以便获得所需的外观。或者,您可以检查单元格(实际上是您应该将其添加到单元格中的cell.contentView,而不是直接添加到单元格)是否具有类UIButton的子视图,并且只有在没有按钮的情况下才添加按钮。

编辑后:

在回答你的评论时,你不需要在故事板中创建圆角按钮,只需在子类单元格中添加一个按钮(自定义类型),然后在代码中修改它的外观。这是我的意思的一个例子。在这个测试应用程序中,我创建了一个自定义单元类(RDCell)并将故事板中单元格的类更改为。我向单元格添加了一个自定义按钮,使用约束对其进行定位和调整大小,并在RDCell.h中为它创建了一个IBOutlet。这是我在表视图控制器中的内容:

#import "TableController.h"
#import "RDCell.h"

@implementation TableController

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(RDCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.button.backgroundColor = [UIColor colorWithHue:.15 + (indexPath.row/30.0) saturation:1 brightness:1 alpha:1];
    cell.button.layer.cornerRadius = 15;
    cell.button.titleLabel.textColor = [UIColor blackColor];
}

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

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [cell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchUpInside];
    cell.button.tag = indexPath.row;
    return cell;
}

-(void)customActionPressed:(UIButton *) sender {
    NSLog(@"button pressed in row: %d",sender.tag);
   [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:sender.tag inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
}

这是结果观点:

enter image description here

我在RDCell的initWithCoder中放了一个日志,它只被调用了12次(任何时候屏幕上最大的单元格数),所以从不超过12个单元格或12个按钮。