为什么我的UITableViewCell没有以任何风格显示detailTextLabel?

时间:2013-03-15 03:58:24

标签: ios uitableview detailtextlabel

这个让我把头发拉出来。我只是尝试使用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下测试。)

5 个答案:

答案 0 :(得分:16)

在尝试了所有这些之后,当我在Storyboard中将表格视图单元格样式设置为“Subtitle”时,字幕显示给我IB Storyboard Cell setting

答案 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;
}