Как передать значение из контроллера TableView в класс customCell - PullRequest
0 голосов
/ 09 апреля 2011

Я создаю пользовательский UITableViewCell программно, который использует следующий код.Что мне интересно, так это сделать фон прозрачным?

Причина, по которой я хочу, чтобы он был прозрачным, заключается в том, что высота UITableViewCell является динамической, и я не могу понять, как передать код «динамической высоты» в класс customCellтак что я решил установить максимальную высоту 300 или около того для CGRect и сделать фон прозрачным, чтобы он не перекрывал следующие ячейки.

ОБНОВЛЕНИЕ:

Создание прозрачной метки не работает, поэтому в основном мне нужно передать высоту 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;
}

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Если вы сделаете ячейки таблицы массивными и прозрачными, вы сделаете рендеринг фантастически медленным!

Я бы взглянул на протокол делегата - этот метод какВы говорите ячейке, как высоко она должна быть.

Вызов [tabelView reloadData] вызовет этот метод для каждой ячейки.Поместите туда свой динамический код высоты.

Надеюсь, это поможет.

0 голосов
/ 10 апреля 2011

Поскольку высота строки зависит от вашего пользовательского макета ячейки (на основе меток), я бы поместил логику определения размера в пользовательский класс ячеек (в 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;
}

И я согласен с другими, что по возможности следует избегать прозрачных ячеек.

0 голосов
/ 09 апреля 2011

установить backgroundColor для ячейки на «[UIColor clearColor]»

...