我知道之前已经多次询问过这种问题..但是我很困惑,即使经过大量的搜索也没有找到任何解决方案..
我有一个表,其中细胞在每第6个细胞后重复...但奇怪的是,如果我点击任何重复的细胞,它会显示我应该显示的正确数据在 didSelectRowAtIndexpath 方法..
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return array.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UIImageView * cellImageView;
NSArray *pathComponents;
NSData *imageData;
UIImage *image;
UILabel * mainLabel = nil;
UITableViewCell *cell = nil;
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
NSLog(@"in loop");
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];
[cell addSubview:mainLabel];
}
mainLabel.backgroundColor = [UIColor clearColor];
mainLabel.textColor = [UIColor redColor];
mainLabel.numberOfLines = 0;
mainLabel.font = [UIFont fontWithName:@"Arial-BoldMT" size:11];
mainLabel.lineBreakMode = NSLineBreakByWordWrapping;
mainLabel.text = [[array objectAtIndex:indexPath.row]retain];
return cell;
}
答案 0 :(得分:4)
if (cell == nil)
{
NSLog(@"in loop");
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];
mainLabel.tag = 1234;
[cell addSubview:mainLabel];
}
else {
mainLabel = (UILabel*)[cell viewWithTag:1234];
}
但除了回收本身的问题外,还有其他一些问题。为了获得最佳性能,标签的所有设置 - 每次都相同的操作 - 应该在if
子句内完成。仅在方法主体中设置变量文本,在if / else。
此外,如果不使用ARC,则应在addSubview调用之后和if
子句结束之前释放标签。
标签文字不应保留为从array
获取的标签文本 - 标签将保留它。
答案 1 :(得分:1)
首次尝试设置mainLabel属性。如果cell == nil
,请保留条件中的主标签属性设置cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
UILabel *mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];
mainLabel.tag=23;
mainLabel.backgroundColor = [UIColor clearColor];
mainLabel.textColor = [UIColor redColor];
mainLabel.numberOfLines = 0;
mainLabel.font = [UIFont fontWithName:@"Arial-BoldMT" size:11];
mainLabel.lineBreakMode = NSLineBreakByWordWrapping;
[cell addSubview:mainLabel];
}
UILabel *mLabel= (UILabel*)[cell viewWithTag:23];
mLabel.text = [array objectAtIndex:indexPath.row];
答案 2 :(得分:0)
问题是您的mainLabel仅在创建新单元格时初始化。写下类似的东西:
if (cell == nil)
{
NSLog(@"in loop");
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
mainLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)];
mainLabel.tag = 100;
[cell addSubview:mainLabel];
} else {
mainLabel = [[cell viewWithTag:100] retain];
}
...
[mainLabel release];