Iphone 如何为分组的UITableView可靠地子类化UITableViewCell?

Iphone 如何为分组的UITableView可靠地子类化UITableViewCell?,iphone,uitableview,subclass,Iphone,Uitableview,Subclass,在编写UITableViewCell的自定义子类时,我发现结果适用于普通样式的UITableView的矩形单元格,但不适用于分组样式表中的圆形单元格 是否有一种方法可以可靠地将UITableViewCell子类化,以绘制适用于分组样式表的单元格?(不使用界面生成器。)您遇到了什么问题?在drawRect中,您将获得一个rect,并知道您的总大小-只需符合该空间即可。如果您使用的是LayoutSubview,同样的问题。我也注意到了这个问题。我的解决方法是将我的表格单元格缩小(宽度从320变为30

在编写
UITableViewCell
的自定义子类时,我发现结果适用于普通样式的
UITableView
的矩形单元格,但不适用于分组样式表中的圆形单元格


是否有一种方法可以可靠地将
UITableViewCell
子类化,以绘制适用于分组样式表的单元格?(不使用界面生成器。)

您遇到了什么问题?在drawRect中,您将获得一个rect,并知道您的总大小-只需符合该空间即可。如果您使用的是LayoutSubview,同样的问题。

我也注意到了这个问题。我的解决方法是将我的表格单元格缩小(宽度从320变为300)。这不是一个很好的解决方案,但效果很好


我不相信在“分组”模式下,您可以单独删除表视图插入。不过我可能错了

我以前对
UITableViewCell
子类有很多问题,但后来我停止了子类化。 将子视图添加到
UITableViewCell
contentView
属性中,似乎在我遇到的任何实例中都可以完成相同的任务,因此我只需在我的
UITableViewController
中执行此操作

下面是一个有标题和值的示例:

- (UITableViewCell *)tableView:(UITableView*)tableView 
         cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{    
    static NSString* CellIdentifier = @"AccountDetailsCell";
    UILabel* mainLabel = nil;
    UILabel* valueLabel = nil;
    const CGFloat kAccountDetailFontSize = 14.0;

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
    if ( cell == nil ) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
                                       reuseIdentifier: CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake( 10.0, 0.0, 150.0, 44.0 )] autorelease];
        mainLabel.tag = MAINLABEL_TAG;
        mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
        mainLabel.textAlignment = UITextAlignmentLeft;
        mainLabel.textColor = [UIColor darkGrayColor];
        mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
        mainLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview: mainLabel];

        valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake( 150.0, 0.0, 150.0, 44.0 )] autorelease];
        valueLabel.tag = VALUELABEL_TAG;
        valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
        valueLabel.textAlignment = UITextAlignmentRight;
        valueLabel.textColor = [UIColor darkTextColor];
        valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        valueLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview: valueLabel];
    }
    else
    {
        mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG];
        valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG];
    }

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row];
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath];

    return cell;
}

答案是否可以像第一次在
UITableViewCell
子类的
layoutSubviews
方法中调用
[super layoutSubviews]
那样简单

这是我的密码

首先,我创建
UITextField
,并将其添加到
initWithStyle:
方法中的
contentView

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        inputField = [[UITextField alloc] initWithFrame:CGRectZero];
        [self.contentView addSubview:inputField];
        inputField.borderStyle = UITextBorderStyleLine;
        [inputField release];
    }
    return self;
}
然后在LayoutSubview中,我得到了以下内容:

-(void)layoutSubviews
{
    inputField.frame = CGRectMake(5, 5, 100, 20);
}
使用该代码,文本字段是屏幕左侧的5px,当然,在分组模式下,文本字段是表格单元格左侧的5px。换句话说,在表视图单元格之外。不好

使用此代码,
inputField
位于单元格右侧5px处,如我所愿:

-(void)layoutSubviews
{
    [super layoutSubviews]; // the magic line
    inputField.frame = CGRectMake(5, 5, 100, 20);
}
不过,我可能完全误解了你的问题


Erik

问题在于,分组模式下的UITableView会切断部分单元格(侧面,以显示背景,并且它还会环绕部分顶部和底部单元格的角)。经过进一步的测试,在drawRect中,表视图单元格没有以正确的大小通过,这是正确的。另一种方法是为标准UITableViewCell设置自定义背景视图,并在那里绘制所有图形。你得到了一个宽度合适的单元格,但你必须自己正确绘制圆角的上下角。我发现这种方法不足以满足我的需要。我有一个单元格,它有多行标题和多行描述,并根据两个标签中包含的文本自动调整大小。我正在-(void)layoutSubviews中调整大小,并记住先调用[super layoutSubviews],但在我看来,self.contentView直到调用之后才调整大小,因此有时我的单元格的高度会出错。这种方法很好,但如果您想使用QuartzCore(如阴影)作为标签,则滚动会很慢,你必须自己画单元格。我对子类很满意,因为我的很多问题都在最近的SDK中得到了纠正。我当前的方法涉及一个带有
configureWithDataObject:(id)dataObject
方法的子类,然后我为我的自定义单元格创建子类。My view controller自动选择正确的单元格子类并调用
configureWithDataObject:
。使开发变得快速和简单(尽管在技术上比在静态代码中进行开发效率要低)。我怎么会错过这一点?!!非常感谢你的魔术线!