Marcal
Marcal

Reputation: 1371

Static UITableViewCell backgroundView

In my project I have tableViews with static cells as well as tableViews with dynamic cells. In order to customized I've managed to get a gradient background on the cells (grouped sytle).

It works ok with dynamic TableViews as I set the background view in cellForRowAtIndex... according to the position of the row (Top, Bottom, Middle or single).

However, when I try to implement it on the static tableview cells, it doesn't work. I've tried to implement the cellForRowAtindex... but it crashes.

Does someone have an idea?

Update: the code for cellForRow..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    

    UACellBackgroundView *bgw=[[UACellBackgroundView alloc]init];

    if (indexPath.row==0) {

        bgw.position = UACellBackgroundViewPositionTop;
        cell.backgroundView=bgw;

    }else if (indexPath.row==2){

        bgw.position = UACellBackgroundViewPositionBottom;
        cell.backgroundView=bgw;

    }else {
        bgw.position = UACellBackgroundViewPositionMiddle;
        cell.backgroundView=bgw;
    }

  //  cell.backgroundView=bgw;


    return cell;
}

By the way, the Background view I got it from here: http://code.coneybeare.net/how-to-make-custom-drawn-gradient-backgrounds and here: http://pessoal.org/blog/2009/02/25/customizing-the-background-border-colors-of-a-uitableview/

if somebody is interested

Upvotes: 1

Views: 734

Answers (2)

Matthias Bauch
Matthias Bauch

Reputation: 90117

If you have a UITableViewController subclass with a static table you should not try to dequeue cells.
Instead you should ask super for the cell. The superclass will get the cell from the storyboard and you can configure it.

Something like this:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

    UIView *selectedBackgroundView = [[UIView alloc] init];
    cell.selectedBackgroundView = selectedBackgroundView;
    cell.selectedBackgroundView.backgroundColor = [UIColor mb_tableViewSelectionColor];
    return cell;
}

Works for all other attributes as well.

Upvotes: 1

Vikings
Vikings

Reputation: 2527

It doesn't look like you are alloc the UITablViewCell, you need to alloc the cell.

For example:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        // alloc the UITableViewCell
        // remeber if you are not using ARC you need to autorelease this cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = @"Cell Name";
    cell.detailTextLabel.text = @"Cell Detail";

    return cell;
}

Add this statement:

if (cell == nil) {
    // alloc the UITableViewCell
    // remeber if you are not using ARC you need to autorelease this cell
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

Upvotes: 1

Related Questions