UITableViewCell的textLabel的字体更改未视觉更改

时间:2012-02-03 20:50:28

标签: ios uitableview

当我将UIViewController推送到我的UINavigation控制器上时,如:

[(UINavigationController *)self.parentViewController pushViewController:[[[Fonts alloc] initWithNibName:@"Fonts" bundle:nil] autorelease] animated:YES];

其中Fonts.xib是一个UIView,只有UITableView由一个Fonts对象控制,该对象是UIViewController的子类,并充当UITableView的dataSource和delegate。

在Fonts对象中,我创建了一个UITableViewCell,如:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"BlahTableViewCell"];

    if (!cell) {
        cell = [[UITableViewCell alloc]
                initWithStyle: UITableViewCellStyleDefault
                reuseIdentifier: @"BlahTableViewCell"];
        [cell autorelease];  // Delete for ARC
    }

    return cell;

}

然后我在这里改变单元格的字体:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell.textLabel setFont:[(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontWithSize:cell.textLabel.font.pointSize]];
    cell.textLabel.text = [(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontName];
}

listOfFonts是UIFont对象的NSArray。

当视图显示时,它看起来像UITableView without changed fonts

如果我在UITableView上调用reloadData,或者如果我用手指将UITableViewCells拖出屏幕并让它们反弹,则会重新绘制它们,并且单元格显示的视图中的字体会更改字体。

似乎问题是UITableViewCells被过早绘制。如果我延迟绘制它们的一切看起来都正确但我希望UINavigationController在UINavigationController将我的视图滑动到位时正确显示。

知道我做错了吗?

编辑:我向Dropbox上传了一个简单直接的问题示例。 http://dl.dropbox.com/u/5535847/UITableViewIssue.zip

3 个答案:

答案 0 :(得分:4)

解决了!

好的,所以我遇到了与原始海报完全相同的问题,这就是问题所在。

造成问题的一行是:

[cell.textLabel setFont:[(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontWithSize:cell.textLabel.font.pointSize]];

具体来说,你的问题是因为你试图将单元格的textLabel提供给它自己的pointSize,但是pointSize还不存在,所以会发生奇怪的错误。对我来说,我注意到由于奇异矩阵是不可逆的,“变换”失败了。一旦我将标准值硬编码为我的pointSize,我就立刻看到所有标签都用正确的字体绘制。注意:这对于重绘的原因是有意义的,因为那时你的textLabel确实有一个pointSize。

在任何情况下,你需要在这里明确设置你的pointSize,不要使用textLabel“已经拥有”的内容,因为在你“重新加载”一个单元格之前它没有任何东西。

答案 1 :(得分:2)

-tableView:cellForRowAtIndexPath:内设置标签字体。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *identifier = @"identifier";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

    // do it here if your font doesn't change ....
  }

  // otherwise here with your font ...
  cell.textLabel.font = [UIFont boldSystemFontOfSize:12];
  return cell;

}

答案 2 :(得分:0)

我不确定表格单元格是否可以通过这种方式进行自定义。表格单元格可能假设您不会自定义字体,因此不能以与您尝试的方式兼容的方式绘制自己。

最好创建一个自定义表格单元格,或者在创建表格单元格时将UILabel作为子视图附加到表格单元格中,然后设置该标签的字体。

对于如此小的定制而言似乎有些过分,但它很灵活且保证可以正常工作。