自定义带图像和标签的uitableViewCell示例

时间:2011-03-11 13:55:06

标签: iphone image label cell

我在开始创建之前创建自定义UITableViewCell我阅读了很多关于它的文章,我开始创建自己的CustomTableViewCell。

在我的自定义TableViewCell中,我有4个filds:

  1. UILabel * cellTitle
  2. UILabel * cellDateTime
  3. UIView * cellMainImage
  4. UIImageView * arraow image
  5. 以下是我的TableViewCell的显示方式: enter image description here

    以下是CustomTableViewCell.h的代码:

    #import <UIKit/UIKit.h>
    
    #define TAGS_TITLE_SIZE     20.0f
    #define TITLE_LABEL_TAG     1
    #define DATA_TIME_LABEL_TAG 5
    #define ARROW_IMAGE_TAG     6
    #define MAIN_IMAGE_TAG      7
    
    // Enumeration for initiakization TableView Cells
    typedef enum {
        NONE_TABLE_CELL      = 0,
        NEWS_FEED_TABLE_CELL = 1,
        TAGS_TABLE_CELL      = 2
    }TableTypeEnumeration;
    
    // Class for Custom Table View Cell.
    @interface CustomTableViewCell : UITableViewCell {
        // Title of the cell.
        UILabel*     cellTitle;
        UILabel*     cellDataTime;
        UIView*      cellMainImage;
        UIImageView* cellArrowImage;
    }
    
    // Set the title of the cell.
    - (void) SetCellTitle: (NSString*) _cellTitle;
    - (void) SetCellDateTime: (NSString*) _cellDataTime;
    
    - (void) ReleaseCellMainImage;
    
    - (void) InitCellTitleLable;
    - (void) InitCellDateTimeLabel;
    - (void) InitCellMainImage;
    
    
    
    // Init With Style (With additional parametr TableTypeEnumeration)
    - (id)initWithStyle: (UITableViewCellStyle)style reuseIdentifier: (NSString *)reuseIdentifier tableType:(TableTypeEnumeration)tabletypeEnum;
    
    @end
    

    以下是代码:CustomTableViewCell.m

    #import "CustomTableViewCell.h"
    
    @implementation CustomTableViewCell
    
    
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        return [self initWithStyle:style reuseIdentifier:reuseIdentifier tableType:NONE_TABLE_CELL];
    }
    
    - (id)initWithStyle: (UITableViewCellStyle)style reuseIdentifier: (NSString *)reuseIdentifier tableType:(TableTypeEnumeration)tabletypeEnum {
        // Get Self.
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
    
            // Switch table View Cells
            switch(tabletypeEnum) {
                case NEWS_FEED_TABLE_CELL: {
    
                    // Create Cell Title Text
                    cellTitle = [[UILabel alloc] initWithFrame:CGRectMake(75.0f, 2.5f, 180.0f, 33.0f)];
                    cellTitle.tag           = TITLE_LABEL_TAG;
                    cellTitle.font          = [UIFont boldSystemFontOfSize: 13.0f];
                    cellTitle.lineBreakMode = UILineBreakModeWordWrap;
                    cellTitle.numberOfLines = 0;
                    cellTitle.textAlignment = UITextAlignmentLeft;
                    cellTitle.textColor     = [UIColor blackColor];
                    [self.contentView addSubview:cellTitle];
                    [cellTitle release];
    
                    // Create Cell Description Text.
                    cellDataTime = [[UILabel alloc] initWithFrame:CGRectMake(135.0f, 38.0f, 100.0f, 15.0f)];
                    cellDataTime.tag           = DATA_TIME_LABEL_TAG;
                    cellDataTime.font          = [UIFont italicSystemFontOfSize: 12.0f];
                    cellDataTime.textAlignment = UITextAlignmentLeft;
                    cellDataTime.textColor     = [UIColor blackColor];
                    cellDataTime.lineBreakMode = UILineBreakModeWordWrap;
                    [self.contentView addSubview:cellDataTime];
                    [cellDataTime release];
    
                    // Create Cell Arrow Image.
                    cellArrowImage = [[UIImageView alloc] initWithFrame:CGRectMake(260.0f, 7.0f, 40.0f, 49.0f)];
                    cellArrowImage.tag             = ARROW_IMAGE_TAG;
                    cellArrowImage.backgroundColor = [UIColor whiteColor];
                    cellArrowImage.image           = [UIImage imageNamed:@"Grey Arrow.png"];;
                    [self.contentView addSubview:cellArrowImage];
                    [cellArrowImage release];
    
                    // Create Cell Main Image.
                    cellMainImage = [[[UIView alloc] initWithFrame:CGRectMake(2.0f, 2.5f, 55.0f, 50.0f)] autorelease];
                    cellMainImage.tag = MAIN_IMAGE_TAG;
                    [self.contentView addSubview:cellMainImage];
    
    
                    break;
                }
                case TAGS_TABLE_CELL: {
    
                    // Create and initialize Title of Custom Cell.
                    cellTitle = [[UILabel alloc] initWithFrame:CGRectMake(10, (44 - TAGS_TITLE_SIZE)/2, 260, 21)];
                    cellTitle.backgroundColor      = [UIColor clearColor];
                    cellTitle.opaque               = NO;
                    cellTitle.textColor            = [UIColor blackColor];
                    cellTitle.highlightedTextColor = [UIColor whiteColor];
                    cellTitle.font                 = [UIFont boldSystemFontOfSize:TAGS_TITLE_SIZE];
                    cellTitle.textAlignment        = UITextAlignmentLeft;
                    [self.contentView addSubview:cellTitle];
                    [cellTitle release];
    
                    break;
                }
                default: break;
            }
        }
        return self;
    
    
    }
    
    - (void) ReleaseCellMainImage {
        [cellMainImage release];
    }
    
    - (void) InitCellTitleLable {
        cellTitle = (UILabel *)[self.contentView viewWithTag:TITLE_LABEL_TAG];
    }
    
    - (void) InitCellDateTimeLabel {
        cellDataTime = (UILabel *)[self.contentView viewWithTag:DATA_TIME_LABEL_TAG];
    }
    
    - (void) InitCellMainImage {
        //UIView* oldImage = [self.contentView viewWithTag:MAIN_IMAGE_TAG];
        //[oldImage removeFromSuperview];
    }
    
    
    - (void) SetCellTitle: (NSString*) _cellTitle {
        cellTitle.text = _cellTitle;
    }
    
    
    - (void) SetCellDateTime: (NSString*) _cellDataTime {
        cellDataTime.text = _cellDataTime;
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    }
    
    
    - (void)dealloc {
    
        // Call base delloc
        [super dealloc];
    }
    
    @end
    

    现在,当我在程序代码中使用CustomTableViewCell时,我的iphone的内存总是会上升!每次当我打开tableView时,内存增长为2mb,当我打开和关闭tableView 10次时,它变得超过30mb!我可以吗?

    还有一个问题

    当用户例如在自定义单元格中按下我的图像时,如何获取该事件???

3 个答案:

答案 0 :(得分:0)

你没有重复使用你的细胞。因此,每次滚动时都会创建一个新单元格。

在您的委托中,您需要重新创建单元格,如下所示:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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



return cell; 

答案 1 :(得分:0)

您在创建单元格时是否正在重复使用单元格?代码中没有任何迹象表明您尝试在init之前从UITableView中将可重用单元出列,尽管这可能在表视图本身中。正如在Praveens帖子中可以看到的那样,尝试将一个单元格出列,并且只有当它返回nil时才会初始化单元格。

因此,每当此特定单元格进入视图时,您可能正在创建新的单元格对象。表视图中是否采用了单元重用?

tableview委托方法中的代码是什么 - tableView:cellForRowAtIndexPath?

答案 2 :(得分:0)

除了考虑其他人所说的单元重用之外,如果每次打开时内存使用量增加,则可能会出现内存泄漏。也许创建表的视图在释放时不会释放它。