我有一个屏幕,我有一个UIScrollView。 UITableView嵌入其中。我遇到的问题是Cell重用。我在这里附上一些屏幕截图,用于澄清问题。
滚动之前:屏幕加载时。
滚动时:
然后向上滚动:
正如您所看到的,由于细胞重用,现在显示LBM代替日期。由于这是一个内置的组表格单元格,我无法使用prepForReuse。
我在这里附加了cellForRowAtIndexPath的代码。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell * cell = (UITableViewCell *)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
if (indexPath.row==0) {
lbl_title = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
lbl_title.textAlignment = UITextAlignmentCenter;
lbl_title.font = [UIFont boldSystemFontOfSize:14];
lbl_title.textColor = [UIColor whiteColor];
lbl_title.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:lbl_title];
}
}
switch (indexPath.row) {
case 0:
lbl_title.text = [NSString stringWithFormat:@"%@ %@",[dic_vitalsDictonary
valueForKey:@"taken_date"],[dic_vitalsDictonary valueForKey:@"taken_time"]];
break;
case 1:
cell.textLabel.text = @"Height";
NSString * str_height = [[dic_vitalsDictonary valueForKey:@"height"] floatValue]
> 0 ? [dic_vitalsDictonary valueForKey:@"height"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_height];
break;
case 2:
cell.textLabel.text = @"Weight";
NSString * str_weight = [[dic_vitalsDictonary valueForKey:@"weight"] floatValue] >
0 ? [dic_vitalsDictonary valueForKey:@"weight"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_weight];
break;
case 3:
cell.textLabel.text = @"Temperature";
NSString * str_temprature = [[dic_vitalsDictonary valueForKey:@"temp"] floatValue]
> 0 ? [dic_vitalsDictonary valueForKey:@"temp"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_temprature];
break;
case 4:
cell.textLabel.text = @"Blood Pressure";
NSString * str_lowbp = [dic_vitalsDictonary valueForKey:@"lowbp"];
NSString * str_highbp = [dic_vitalsDictonary valueForKey:@"highbp"];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@/%@",[self
setDecimalFormatForString:str_lowbp],[self setDecimalFormatForString:str_highbp]];
break;
case 5:
cell.textLabel.text = @"Blood Sugar";
NSString * str_bs1 = [dic_vitalsDictonary valueForKey:@"bs_1"];
NSString * str_bs2 = [dic_vitalsDictonary valueForKey:@"bs_2"];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@/%@",[self
setDecimalFormatForString:str_bs1],[self setDecimalFormatForString:str_bs2]];
break;
case 6:
cell.textLabel.text = @"Pulse";
NSString * str_pulse = [[dic_vitalsDictonary valueForKey:@"pulse"] floatValue] > 0
? [dic_vitalsDictonary valueForKey:@"pulse"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_pulse];
break;
case 7:
cell.textLabel.text = @"Resp";
NSString * str_resp = [[dic_vitalsDictonary valueForKey:@"resp"] floatValue] > 0 ?
[dic_vitalsDictonary valueForKey:@"resp"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_resp];
break;
case 8:
cell.textLabel.text = @"Oxygen";
NSString * str_oxyzen = [[dic_vitalsDictonary valueForKey:@"oxygen"] floatValue] >
0 ? [dic_vitalsDictonary valueForKey:@"oxygen"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_oxyzen];
break;
case 9:
cell.textLabel.text = @"Fatmass";
NSString * str_fatmass = [[dic_vitalsDictonary valueForKey:@"fatmass"] floatValue]
> 0 ? [dic_vitalsDictonary valueForKey:@"fatmass"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_fatmass];
break;
case 10:
cell.textLabel.text = @"LBM";
NSString * str_lbm = [[dic_vitalsDictonary valueForKey:@"lbm"] floatValue] > 0 ?
[dic_vitalsDictonary valueForKey:@"lbm"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_lbm];
break;
case 11:
cell.textLabel.text = @"HC";
NSString * str_hc = [[dic_vitalsDictonary valueForKey:@"hc"] floatValue] > 0 ?
[dic_vitalsDictonary valueForKey:@"hc"] : @"";
cell.detailTextLabel.text = [self setDecimalFormatForString:str_hc];
break;
case 12:
cell.textLabel.text = @"Peakflow";
NSString * str_peakflow = [[dic_vitalsDictonary valueForKey:@"peakflow"]
floatValue] > 0 ? [dic_vitalsDictonary valueForKey:@"peakflow"] : @"";
cell.detailTextLabel.text =[self setDecimalFormatForString:str_peakflow];
break;
default:
break;
}
// Set the Background Image for TableviewCell.
// if 1st row then we are showing different image to Display Vitals Date.
if (indexPath.row==0) {
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage
imageNamed:@"HeaderNavigation.png"]];
}
else{
// Set the Background Image for TableviewCell.
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage
imageNamed:@"cell_background.png"]];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
请建议一些方法来克服这种情况。我已经尝试了很多,但似乎没有任何东西按我想要的方式工作。我想阻止单元格被重用,以便在滚动过程中不会重复它。
答案 0 :(得分:0)
尝试为每个单元格提供唯一标识符
NSString *CellIdentifier =[NSString stringWithFormat:"Cell %d",indexpath.row];
不知道这是否正确,但它应该解决你的问题。
答案 1 :(得分:0)
尝试在switch语句之前设置cell.textLabel.hidden = NO;
,然后将其隐藏在第一行:
case 0:
cell.textLabel.hidden = YES; //this is added
lbl_title.text = [NSString stringWithFormat:@"%@ %@",[dic_vitalsDictonary
valueForKey:@"taken_date"],[dic_vitalsDictonary valueForKey:@"taken_time"]];
break;
答案 2 :(得分:0)
两项更改:向lbl_title
添加标记,并在为第一行创建单元格时重新使用并隐藏textLabel
时删除带有该标记的子视图。或者,为第一行使用不同的单元格标识符,因为该单元格与其余单元格不同。
编辑:有几个例子可以说明如何做到这一点。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell * cell = (UITableViewCell *)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
}
UILabel *lbl_title = (UILabel*)[cell.contentView viewWithTag: 'lblt'];
lbl_title.hidden = YES;
cell.textLabel.hidden = NO;
switch (indexPath.row) {
case 0:
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
if (lbl_title == nil)
{
lbl_title = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
lbl_title.tag = 'lblt';
lbl_title.textAlignment = UITextAlignmentCenter;
lbl_title.font = [UIFont boldSystemFontOfSize:14];
lbl_title.textColor = [UIColor whiteColor];
lbl_title.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:lbl_title];
}
lbl_title.hidden = NO;
cell.textLabel.hidden = YES;
lbl_title.text = [NSString stringWithFormat:@"%@ %@",[dic_vitalsDictonary
valueForKey:@"taken_date"],[dic_vitalsDictonary valueForKey:@"taken_time"]];
break;
case 1:
或者,
只需将[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
更改为[tableView dequeueReusableCellWithIdentifier: (indexPath.row == 0 ? CellIdentifier2 : CellIdentifier)];
,因为第一行使用不同类型的单元格。
答案 3 :(得分:0)
这是因为如果cell == nil条件,则配置标题标签。 它不会每次都执行。所以使用下面的代码来满足你的要求。你不需要将标题标签声明为全球。
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
UILabel *lbl_title= [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
lbl_title.textAlignment = UITextAlignmentCenter;
lbl_title.tag=21;
lbl_title.font = [UIFont boldSystemFontOfSize:14];
lbl_title.textColor = [UIColor whiteColor];
lbl_title.backgroundColor = [UIColor clearColor];
[cell addSubview:lbl_title];
}
if (indexPath.row==0) {
UILabel *titleLabel=(UILabel*)[cell viewWithTag:21];
titleLabel.text=@"May 1 ,2013 17:23:49";
}else{
UILabel *titleLabel=(UILabel*)[cell viewWithTag:21];
titleLabel.text=@"";
}
答案 4 :(得分:0)
我认为你可以这样做:
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
UILabel *topLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
topLabel.textAlignment = UITextAlignmentCenter;
topLabel.font = [UIFont boldSystemFontOfSize:14];
topLabel.textColor = [UIColor whiteColor];
topLabel.backgroundColor = [UIColor clearColor];
topLabel.tag = 1;// unique for all subviews of cell
[cell.contentView addSubview:topLabel];
}
topLabel = (UILabel *)[cell.contentView viewWithTag:1];
topLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.textLabel.text = nil;
switch (indexPath.row) {
case 0:
topLabel.text = [NSString stringWithFormat:@"%@ %@",[dic_vitalsDictonary
valueForKey:@"taken_date"],[dic_vitalsDictonary valueForKey:@"taken_time"]];
break;
//OTHER CODE
答案 5 :(得分:0)
滚动时必须删除标签才能重复使用。所以使用这些编码行:
if (cell == nil)
{
// your code for adding label and set tag as 99
}
else
{
UILabel *label = (UILabel *)[cell.contentView viewWithTag:99];
[label removeFromSuperview];
label = nil;
}
祝你好运!!
答案 6 :(得分:-1)
如果您不想重复使用单元格,请更新此代码
UITableViewCell * cell = (UITableViewCell *)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
if (indexPath.row==0) {
lbl_title = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
lbl_title.textAlignment = UITextAlignmentCenter;
lbl_title.font = [UIFont boldSystemFontOfSize:14];
lbl_title.textColor = [UIColor whiteColor];
lbl_title.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:lbl_title];
}
}
用这个
UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:CellIdentifier] autorelease];
// Here we are creating Custom Label to Display the TakenTime and TakenDate of Vitals
// in center.
if (indexPath.row==0) {
lbl_title = [[UILabel alloc] initWithFrame:CGRectMake(0, 2, 320, 33)];
lbl_title.textAlignment = UITextAlignmentCenter;
lbl_title.font = [UIFont boldSystemFontOfSize:14];
lbl_title.textColor = [UIColor whiteColor];
lbl_title.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:lbl_title];
}