我在tableview
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//static NSString *CellIdentifier = @"Cell";
NSString *CellIdentifier = [NSString stringWithFormat:@"%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell.imageView.image = nil;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
// Configure the cell...
for (UIView *view in cell.contentView.subviews) {
if ([view isKindOfClass:[UIButton class]] || [view isKindOfClass:[UILabel class]]||[view isKindOfClass:[UIImageView class]]) {
[view removeFromSuperview];
}
}
int imageNumber = 0;
if (isInSearchMode)
{
PhotoVO *photoVO = (PhotoVO *)[searchResultArray objectAtIndex:indexPath.row];
UIImageView *photo_View = [[UIImageView alloc]initWithFrame:CGRectMake(20, 5, width , height - 10)];
photo_View.tag = 101;
[[photo_View layer] setBorderWidth:3.0f];
[[photo_View layer] setBorderColor:[UIColor whiteColor].CGColor];
[photo_View setImageWithURL:[NSURL URLWithString:photoVO.thumb_URL1] placeholderImage:[UIImage imageNamed:@"loader"]];
[cell.contentView addSubview:photo_View];
UILabel *stringLable=[[UILabel alloc]initWithFrame:CGRectMake(130, 20, 150, 30)];
stringLable.backgroundColor=[UIColor clearColor];
stringLable.text=photoVO.photoName;
stringLable.font=[UIFont systemFontOfSize:16.0];
[cell.contentView addSubview:stringLable];
UILabel *tagLable=[[UILabel alloc]initWithFrame:CGRectMake(130, 55, 150, 30)];
tagLable.backgroundColor=[UIColor clearColor];
tagLable.text=photoVO.tagString;
tagLable.font=[UIFont systemFontOfSize:12.0];
[cell.contentView addSubview:tagLable];
}
else
{
for (int i = (indexPath.row * imagesCount); i < ((indexPath.row *imagesCount) + imagesCount); i++) {
if (i < [cellImageVOArray count]) { // If resultsArray Count is odd then we no need to create cell image
PhotoVO *photoVo = (PhotoVO *)[cellImageVOArray objectAtIndex:i];
UIButton *appIconBtn = [UIButton buttonWithType:UIButtonTypeCustom];
appIconBtn.frame = CGRectMake(((imageNumber * 5)+5)+(imageNumber * width), 2, width, height -4);
appIconBtn.tag = i + 100;
[[appIconBtn layer] setBorderWidth:3.0f];
[[appIconBtn layer] setBorderColor:[UIColor whiteColor].CGColor];
[appIconBtn addTarget:self action:@selector(imageTapped:) forControlEvents:UIControlEventTouchUpInside];
[appIconBtn setBackgroundImageWithURL:[NSURL URLWithString:photoVo.thumb_URL1] placeholderImage:[UIImage imageNamed:@"loader.png"]];
//[appIconBtn setBackgroundImageWithURL:[NSURL URLWithString:photoVo.thumb_URL1]];
[cell.contentView addSubview:appIconBtn];
imageNumber ++;
}
}
}
return cell;
}
我使用上面的代码在tableView
中显示图像,但是我检查它的所有方式都会收到内存警告。我认为每次都会创建单元格,所以如果您在代码中看到任何问题,请告诉我。
答案 0 :(得分:5)
这是一个问题:NSString *CellIdentifier = [NSString stringWithFormat:@"%d",indexPath.row];
您不会重复使用任何内容,因为您正在为每个单元格创建新的标识符。可以重复使用几种不同的单元格样式,但您只需为每一行创建一个新单元格。
第二次,你需要考虑一下你在这里做了什么:
for (UIView *view in cell.contentView.subviews) {
if ([view isKindOfClass:[UIButton class]] || [view isKindOfClass:[UILabel class]]||[view isKindOfClass:[UIImageView class]]) {
[view removeFromSuperview];
}
}
每次需要一个细胞时,你都要移除制作细胞的部分,然后重新制作它们。您应该在UITableView
中尽可能多地重复使用。您应该考虑创建一个UITableViewCell
的自定义子类,其中包含您需要的部分,然后使用它。可以这么说,看起来你只有一个图像和两个默认UITableViewCell
所拥有的标签,所以你可能根本不需要创建它们,除非你的单元格是非常自定义的。
最后,您应该看看您使用isInSearchMode
做了些什么。现在你基本上有一个整个表的if语句。这不是一个可怕的事情,但如果你这样做,你应该有两个单元格标识符,每个可能的单元格一个。然后在if
语句中只需交换单元格标识符并填写相应的数据。
最重要的是,如果可能的话(在您的情况下似乎是这样),您根本不应该在此方法中创建新视图。您应该让UITableViewCell
处理。
创建自定义单元格
您从UITableViewCell
的简单子类开始。然后,您可以为UILabel
或UIImageView
所需的每个自定义部件添加属性。您可以通过覆盖init
来创建它们,也可以将它们放在自定义属性getter中,以便按需创建它们。
// CustomCell.h
#import <UIKit/UIKit.h>
@interface Custom : UITableViewCell
@property (strong, nonatomic) UILabel *titleLabel;
@end
// CustomCell.m
#import "CustomCell.h"
@implementation CustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(12.0, 10.0, self.contentView.frame.size.width - 24.0, 22.0)];
[self.titleLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self.titleLabel setHighlightedTextColor:[UIColor whiteColor]];
[self.titleLabel setFont:[UIFont boldSystemFontOfSize:17.0]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setTextColor:[UIColor blackColor]];
[self.titleLabel setAdjustsFontSizeToFitWidth:YES];
[self.titleLabel setMinimumFontSize:8.0];
[self.contentView addSubview:self.titleLabel];
}
return self;
}
@end
然后,您只需要重写cellForRowAtIndexPath:
即可使用自定义类。在您的情况下,您可以有两个自定义单元格并在它们之间切换。这将按需创建每个单元格,并在屏幕上移动时重复使用它们。
static NSString *CellIdentifier = @"Cell";
static NSString *SearchCellIdentifier = @"SearchCell";
if (isInSearchMode) {
SearchCell *cell = (SearchCell *)[tableView dequeueReusableCellWithIdentifier:SearchCellIdentifier];
if (cell == nil) {
cell = [[SearchCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell.titleLabel = @"Custom Search Title";
} else {
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell.titleLabel = @"Custom Title";
}
根据您的应用程序的工作原理,这可以很容易地进行重构,但这应该会让您走上正确的道路。
答案 1 :(得分:0)
是的,每行都有不同的单元格标识符,因此不会重复使用。
变化:
NSString *CellIdentifier = [NSString stringWithFormat:@"%d",indexPath.row];
到
NSString *CellIdentifier = @"CellId";