我在开始创建之前创建自定义UITableViewCell我阅读了很多关于它的文章,我开始创建自己的CustomTableViewCell。
在我的自定义TableViewCell中,我有4个filds:
以下是我的TableViewCell的显示方式:
以下是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!我可以吗?
还有一个问题
当用户例如在自定义单元格中按下我的图像时,如何获取该事件???
答案 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)
除了考虑其他人所说的单元重用之外,如果每次打开时内存使用量增加,则可能会出现内存泄漏。也许创建表的视图在释放时不会释放它。