UITableViewCell的textLabel的字体更改不可见地更改

当我推UIViewController到我的UINavigation控制器,如:

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

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

在字体对象中,我创build了一个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没有改变字体

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

看来问题是UITableViewCells被绘制得太早了。 如果我延迟绘制他们一切看起来是正确的,但我希望UITableView正确显示,当UINavigationController滑动我的视图到位。

任何想法我做错了什么?

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

解决它!

好的,我和原来的海报有完全一样的问题,这就是问题所在。

导致问题的线是:

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

具体来说,你的问题是因为你试图给单元格的textLabel自己的pointSize,但pointSize不存在,所以发生了奇怪的错误。 对于我来说,我注意到由于奇异matrix是不可逆的,“变换”失败了。 只要我硬编码一个标准值作为我的pointSize,我看到我所有的标签立即用适当的字体绘制。 注意:这对于重绘的工作原理是有意义的,因为那么textLabel确实有一个pointSize。

无论如何,你需要在这里明确地设置你的pointSize,不要使用textLabel“已经有的”,因为它没有任何东西,直到你“重新加载”一个单元格。

-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; 

}

我不确定表格单元是否可以用这种方式进行定制。 表格单元格可能会假定您不会自定义字体,也不会以与您正在尝试执行的操作兼容的方式绘制自己。

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

对于这样一个小的定制看起来似乎有点矫枉过正,但是它很灵活,并且保证了工作。