这个让我把头发拉出来。我只是尝试使用UITableViewCellStyleSubtitle样式创建一个带有文本和细节的表。但细节并没有显现出来。通常这是因为有人忘记用正确的样式初始化单元格,但这不是在这种情况下发生的事情。我已经尝试了所有四种单元格样式,并且细节没有显示在任何单元格中,尽管当我使用UITableViewCellStyleValue2时文本标签确实向右移动。
我之前已多次成功创建过表格。在这种情况下,我能想到的唯一重要区别是我没有使用UITableViewController。相反,我像任何其他视图一样嵌入UITableView,并连接我自己的数据源和委托。
我已经把关键方法归结为:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Get the UITableViewCell (out of the recycling pool, or de novo)
NSString *reuseID = @"CELL";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseID];
if (not cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseID] autorelease];
}
cell.textLabel.text = @"Foo";
cell.detailTextLabel.text = @"Bar";
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.detailTextLabel.frame = CGRectMake(10, 20, 200,22); // required
cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:12]; // also required
//[cell setNeedsLayout]; (makes no difference)
return cell;
}
只有当我同时包含" required"上面的行(并使用除Default之外的任何单元格样式),即使我这样做,文本标签的位置也完全重叠细节标签的位置。
因此看起来好像初始化程序正在创建detailTextLabel UILabel,但是将其字体大小设置为零,并将其框架设置为空或屏幕外。 (我已尝试在调试器中检查这些内容,但它不是很有用 - 字体大小为零,框架为空,表示textLabel和detailTextLabel,但textLabel始终显示正常。)< / p>
显然,如果必须,我可以通过手动调整标签大小和字体来解决它。但是,在这种情况下,我必须这样做,这通常只是设置样式,文本和布局是自动的,这让我非常不安。我搜索了谷歌并且堆栈溢出,但找不到任何类似问题的引用。有没有人知道这里发生了什么?
(在iOS 6.1下测试。)
答案 0 :(得分:16)
在尝试了所有这些之后,当我在Storyboard中将表格视图单元格样式设置为“Subtitle”时,字幕显示给我
答案 1 :(得分:7)
注册标准UITableViewCell
类可能会阻止您使用样式化的UITableViewCell
,因为此代码永远不会被执行:
if (cell == nil) {
// Cell will never be nil if a class/nib is registered
}
解决方案:您是否在Class
注册了笔尖或UITableView
?如果您有如下所示的行,请尝试删除:
[self.tableView registerClass:[UITableViewCell class]
forCellReuseIdentifier:"cellReuseID"];
并更新您的出列语句,如下所示:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:"cellReuseID"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:"cellReuseID"];
}
答案 2 :(得分:3)
好的,事实证明我们在这个应用程序上有一个非常不寻常的构建过程,它没有正确识别应用程序针对Cocoa框架构建的SDK。
结果,Cocoa认为这是一个非常古老的应用程序 - 从iOS4之前的日子开始,在添加detailTextLabel之前。因此,该框架试图通过模拟iOS4之前的行为(通过以几种方式隐藏detailTextLabel)来提供帮助。在_UIApplicationLinkedOnOrAfter上设置一个断点,并强制它返回1,允许我破解这个功能并证明它是原因。 (现在我们只需要修复我们的构建过程来报告正确的SDK版本。)
毋庸置疑,这不是大多数人会遇到的问题。但是为了后人的缘故,我想我会在这里发布答案。
答案 3 :(得分:1)
我希望这会对你有所帮助,一旦检查
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = @"Foo";
cell.detailTextLabel.text = @"Bar";
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.frame = CGRectMake(10, 20, 100,22);
return cell;
}
字体大小,单元格背景颜色变化等操作。标记了以下方法中您必须执行的所有功能。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:10];
cell.textLabel.backgroundColor=[UIColor redColor];
cell.textLabel.frame = CGRectMake(10, 20, 100,22);
cell.detailTextLabel.frame = CGRectMake(10, 20, 200,22);
}
如果你在cellForRowAtIndexPath这个方法中更改这些类型的属性,那么你将丢失这些属性。
答案 4 :(得分:0)
问题是您最有可能使用
注册您的手机[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];
含义
if (not cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseID] autorelease];
}
永远不会调用因为单元格永远不会为空。因此,表格将始终将单元格初始化为UITableViewCellStyleNone。
解决这个问题的唯一方法是从故事板注册单元格或者为UITableViewCell创建子类并覆盖
(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
方法
这对我有用:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:reuseIdentifier]) {
}
return self;
}