繁体   English   中英

如何将值从TableView控制器传递到customCell类

[英]How to pass a value from the TableView controller to a customCell class

我正在以编程方式创建自定义UITableViewCell,它使用以下代码。 我想知道如何使其背景透明化?

我之所以希望它透明,是因为UITableViewCell的高度是动态的,我无法弄清楚如何将“动态高度”代码传递给customCell类,因此我想为CGRect设置最大高度为300左右,并且使背景透明,使其不会与以下单元格重叠。

使标签透明不起作用,因此我需要将TableViewCell的高度传递给自定义类。

customCell类

#import "customCell.h"


@implementation customCell
@synthesize primaryLabel;
@synthesize secondaryLabel;
@synthesize priceLabel;

@synthesize rectColor;

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
    if (self == [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
        // Initialization code
        primaryLabel = [[UILabel alloc]init];
        primaryLabel.textAlignment = UITextAlignmentLeft;
        primaryLabel.font = [UIFont systemFontOfSize:10];
        secondaryLabel = [[UILabel alloc]init];
        secondaryLabel.textAlignment = UITextAlignmentLeft;
        secondaryLabel.font = [UIFont systemFontOfSize:8];
        priceLabel = [[UILabel alloc]init];
        priceLabel.textAlignment = UITextAlignmentLeft;
        priceLabel.font = [UIFont systemFontOfSize:10];

        //self.rectColor = kDefaultRectColor;

        [self.contentView addSubview:primaryLabel];
        [self.contentView addSubview:secondaryLabel];
        [self.contentView addSubview:priceLabel];

    }
    return self;
}


- (void)layoutSubviews {
    [super layoutSubviews];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;
    CGRect frame;
    //CGContextSetFillColor(context, [UIColor clearColor]);


    frame= CGRectMake(boundsX+5 ,5, 200, 15);
    primaryLabel.frame = frame;

    frame= CGRectMake(boundsX+10 ,20, 300, 15);
    secondaryLabel.frame = frame;

    frame= CGRectMake(boundsX+270 ,0, 50, 15);
    priceLabel.frame = frame;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (void)dealloc
{
    [super dealloc];
}

@end

UITableView类别

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    customCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell = [[[customCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    }

    cell.primaryLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.primaryLabel.font = [UIFont boldSystemFontOfSize:18];
    cell.primaryLabel.numberOfLines = ceilf([[[data objectAtIndex:indexPath.row] objectForKey:@"description"] sizeWithFont:[UIFont boldSystemFontOfSize:18] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap].height/20.0);
    cell.secondaryLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"description"];
    cell.secondaryLabel.font = [UIFont systemFontOfSize:14];
    cell.secondaryLabel.numberOfLines = ceilf([[[data objectAtIndex:indexPath.row] objectForKey:@"description"] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap].height/20.0);
    cell.priceLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"price"];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *titleString = [[data objectAtIndex:indexPath.row] objectForKey:@"title"];
    NSString *detailString = [[data objectAtIndex:indexPath.row] objectForKey:@"description"];
    CGSize titleSize = [titleString sizeWithFont:[UIFont boldSystemFontOfSize:18] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap];
    CGSize detailSize = [detailString sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap];

    return detailSize.height+titleSize.height;
}

如果使表格单元变得庞大且透明,您将使渲染变得异常缓慢!

我来看看委托协议 -这种方法是您告诉单元格应该有多高的方法。

调用[tabelView reloadData]将导致为每个单元[tabelView reloadData]此方法。 将您的动态高度代码放在那里。

希望能有所帮助。

将单元格上的backgroundColor设置为“ [UIColor clearColor]”

因为行高取决于您的自定义单元格布局(基于标签),所以我将大小调整逻辑放入自定义单元格类中(在layoutSubviews ),然后在tableViewController执行以下操作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // initialize and configure your cell
    [cell setNeedsLayout];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

我同意其他人的看法,即如果可能,应避免使用透明单元。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM