在UITableView中为每个单元格添加不同的UILabel

时间:2011-07-23 09:33:39

标签: objective-c ios uitableview uilabel

我在UITableView中为每个单元格添加了不同的文本。然而,当我这样做时,测试显示在除第一个之外的每个单元格中。因此,如果在第二个单元格中显示1到9之间的9个数字的数组,则在第三个单元格中分别显示2。第一个单元格中没有显示任何代码

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell = [self getCellContentView:CellIdentifier];
}
if (indexPath.row == 0) {
    NSLog(@"hi");
}
//add another textfield
NSString *path = [[NSBundle mainBundle] pathForResource:@"Rankvalue" ofType:@"plist"];
NSMutableArray* rank = [[NSMutableArray alloc] initWithContentsOfFile:path];
NSString *rankValue = [rank objectAtIndex:indexPath.row];

UILabel *rankLabel = (UILabel *)[cell viewWithTag:1];
rankLabel.text = rankValue;
[rankLabel setFont:[UIFont fontWithName:@"austin power" size:[@"40" intValue]]];

CGRect labelFrame = CGRectMake(220,70,50,40.0);
[rankLabel setFrame:labelFrame];

// Configure the cell(thumbnail).
cell.textLabel.text = [self.stars objectAtIndex:indexPath.row];
NSString *path2 = [[NSBundle mainBundle] pathForResource:@"Filename" ofType:@"plist"];
self.filename = [[NSMutableArray alloc] initWithContentsOfFile:path2];
cell.imageView.image = [UIImage imageNamed:[self.filename objectAtIndex:indexPath.row]];

//transparent cell
cell.backgroundColor = [UIColor clearColor];

[rankLabel release];
[rankValue release];

return cell;
}

这是单元格子视图的代码

- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

CGRect CellFrame = CGRectMake(0, 0, 320, 65);
CGRect Label1Frame = CGRectMake(17,5,250,18);  

UILabel *lblTemp;


UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease];  
lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
[lblTemp setFont:[UIFont fontWithName:@"Arial-Bold" size:15]];
lblTemp.tag = 1;
lblTemp.backgroundColor=[UIColor clearColor];
lblTemp.numberOfLines=0;
[cell.contentView addSubview:lblTemp];    

return cell;
}

2 个答案:

答案 0 :(得分:0)

尝试切换:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell = [self getCellContentView:CellIdentifier];
}

为此:

UITableViewCell *cell=[self getCellContentView:CellIdentifier];

不是说它会起作用,而是试一试。另外,在getCellContentView中执行此操作:

[lblTemp release]

或者你会有泄漏。

答案 1 :(得分:0)

initWithFrame:reuseIdentifier:已弃用initWithStyle:reuseIdentifier:

您应该创建一种标准样式。

在创建单元格时设置所需的值(字体等),而不是在刷新时。文本字段的框架是相同的。和背景颜色。

真的每次刷新一个单元格时都不想重新加载那个plist(哦,有两个!)在另一种方法中加载一次并将其缓存为ivar。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"Cell";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    // create and set up all the layout attributes of the cell
    // it should be auto released
    // which should include a call like the following, or loading a cell from a nib
    // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
    //                               reuseIdentifier:CellIdentifier];
    // [cell autorelease];
  }

  // the only thing that should happen here is setting the data values
  // into the cell!!!!!!  All these values should be loaded once and
  // kept as "model state" by the controller.  Do not create an image
  // each time through, do not load an entire plist to access one item
  // each time through

  rankLabel.text = rankValue;
  cell.textLabel.text = [self.stars objectAtIndex:indexPath.row];
  cell.imageView.image = [self imageAtRow:indexPath.row];


}

如果您为每个单元格显示的图像不同,则使用imageNamed:是不合适的。如果有2或3个图像指示将大量使用的单元格类型,则imageNamed:可能更可取。 imageWithContentsOfFile:是您的另一种选择,您需要构建完整路径