我正在尝试在UITableView中为我的单元格添加自定义标签。当我尝试这样做时,显示器搞砸了,我无法弄清楚到底发生了什么。请找到下面的图片,我将发布我写的方法..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//cell.textLabel.font=[UIFont systemFontOfSize:16];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSString *contact=[contactKeys objectAtIndex:[indexPath section]];
NSArray *contactSection=[contactNames objectForKey:contact];
NSMutableArray *sugar=[db sugarId];
if (isSearchOn) {
NSString *cellValue = [searchResult objectAtIndex:indexPath.row];
NSArray *splitText = [cellValue componentsSeparatedByString:@":"];
NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];
//NSString *result=[contactText stringByAppendingString:[sugar objectAtIndex:[indexPath row]]];
firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];
firstLabel.tag =40; //This should be a constant probably
firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
firstLabel.text = contactText;
[firstLabel sizeToFit];
[cell.contentView addSubview:firstLabel];
sugarLabel = [[UILabel alloc] initWithFrame:
CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
sugarLabel.tag =40; //This should be a constant probably
//sugarLabel.font = [UIFont boldSystemFontOfSize:16];
sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
[sugarLabel setHidden:YES];
[cell.contentView addSubview:sugarLabel];
cell.textLabel.text =firstLabel.text;
} else {
NSString *cellText = [contactSection objectAtIndex:[indexPath row]];
// split the text by the : to get an array containing { "AAA", "BBB" }
NSArray *splitText = [cellText componentsSeparatedByString:@":"];
// form a new string of the form "BBB AAA" by using the individual entries in the array
NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];
firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];
firstLabel.tag =40; //This should be a constant probably
//firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
firstLabel.text = contactText;
[firstLabel sizeToFit];
[cell.contentView addSubview:firstLabel];
sugarLabel = [[UILabel alloc] initWithFrame:
CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
sugarLabel.tag =40; //This should be a constant probably
//sugarLabel.font = [UIFont boldSystemFontOfSize:16];
sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
[sugarLabel setHidden:YES];
[cell.contentView addSubview:sugarLabel];
NSString *result=[NSString stringWithFormat:@"%@ %@",firstLabel.text,sugarLabel.text];
cell.textLabel.text=result;
}
图2:这是对BP建议的代码的修改。结果在这里......
修改
每当我尝试编写stringWithFormat或上述语句时,内存都不会被释放,并且标签会相互重叠。有没有办法解决这个问题..请帮助我..我花了半天多的时间试图弄清楚但没有运气
答案 0 :(得分:2)
如果你想拥有自定义单元格,我建议你继承UITableViewCell。在您给出的示例代码中,每次tableview要求索引路径中的行的单元格时,您都在创建新标签。当你自动释放它们时,你也会添加它们的单元格的内容视图,这会增加它们的保留计数并确保它们的生命周期和tableview的一样长。
当重复使用单元格时,您将继续向其内容视图添加越来越多的标签,直到最终内存不足为止。
就奇怪的文本输出而言,看起来您正在使用格式调用的字符串添加UILabel。
如果您要执行类似下面的代码,您会看到类似的内容。
UILabel *label = [[UILabel alloc] init];
NSLog(@"%@", label);
[label release];
编辑:看到你编辑过的截图,我假设你向下滚动到'S'部分。在这种情况下,您会在其他标签上看到标签。就像我提到的那样,您每次都会创建一个新标签,并将其放在您创建第一个(以及第二个,第三个等)时间的标签之上。
答案 1 :(得分:2)
你获得UILabel:...项目的原因是方法的最后一行,你设置了cell.textLabel.text。如果要创建包含自己字段的单元格,则不希望这样做。
答案 2 :(得分:2)
NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel]
应为:
NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel.text]
您传入的是UILabel,而不是NSString
修改强>
尝试仅在if (cell == nil) {
块中实例化和添加UILabel。
访问标签属性并在此块外写入是正常的