我正在开发一个简单的应用程序来在表格视图中显示项目。如果我从以下位置返回一个普通UITableViewCell
对象tableView:cellForRowAtIndexPath
:
static NSString *cellIdentifier = @"EmailCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"EmailCell"];
}
cell.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
...然后与动态文本的交互按预期工作;如果用户去Settings | General | Text Size
,更改滑块值然后返回到我的应用程序,所有可见单元格都会立即更新自己以使用新的字体大小。
但是,如果我返回 UITableViewCell 的自定义子类,其中 XIB 包含UILabel
设置为使用文本样式而不是系统字体,则动态文本无法正常工作。这是我用来将 XIB 分配给表的代码viewDidLoad
:
[self.table registerNib:[UINib nibWithNibName:@"EmailCell"
bundle:[NSBundle mainBundle]]
forCellReuseIdentifier:@"EmailCell"];
然后这段代码在tableView:cellForRowAtIndexPath:
static NSString *cellIdentifier = @"EmailCell";
EmailCell *cell = (EmailCell *)[tableView
dequeueReusableCellWithIdentifier:cellIdentifier];
当我第一次运行该应用程序时,可见单元格的文本大小与用户选择的首选文本大小相匹配。但是,如果我然后转到设置并更改该大小,然后返回我的应用程序,则所有可见单元格都会保留以前的文本大小。如果我然后向上滚动,我将看到两个显示新(正确)文本大小的单元格,但其余的仍然是旧大小。如果我停止并重新启动应用程序,所有单元格现在都会以新的(正确的)文本大小显示。
在我看来,tableview 将先前大小的单元格保留在队列中,并且不会自动更新其字体大小以响应用户对首选文本大小的更改。但是我不明白为什么当队列包含普通的非子类实例时 tableview会自动进行此更改。UITableViewCell
有什么方法可以在不重新启动应用程序(或不重新创建UITableView
实例,从而清空队列)的情况下使其工作?有没有办法以编程方式(和合法地)清除这个队列?
编辑:如果有人对此问题感兴趣,我对此的直接修复是编写一个通用实用程序方法来创建一个新的 tableview,复制原始 tableview 中的所有相关属性(包括注册的单元格类),然后交换旧的换新的。由于这是一个新表,它会生成包含新文本大小的排队单元的全新实例。