tablecell background only displays custom cell but displaying custom cell renders it unselectable

41 views Asked by At

I have created a custom tableCell When I connect the xib via backgroundView to the file owner I successfully get items to appear in my table. The problem is I am not able to select a row and get a return.

table cells work

If I unselect backgroundView then my custom cell does not populate but I am able to select a cell and extract a notification. I obviously want both of these items to work. Display my custom cell and have the ability to select a specific cell. clicking works

GameTableCell.m

#import "GameTableCell.h"

@implementation GameTableCell
@synthesize GameTime, AwayImage, HomeImage;


- (void)awakeFromNib {
    // Initialization code
}


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

    // Configure the view for the selected state
}
/*
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}
*/

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"GameTableCell" owner:self options:nil];
    self = [topLevelObjects objectAtIndex:0];
    return self;
}

@end

GameTable.h:

#import <UIKit/UIKit.h>

@interface GameTableCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *GameTime;
@property (weak, nonatomic) IBOutlet UIImageView *AwayImage;
@property (weak, nonatomic) IBOutlet UIImageView *HomeImage;


@end

HomePage.m:

 #import "HomePage.h"
    #import "PickSport.h"
    #import "GameTableCell.h"

    static NSString *CellIdentifier = @"GameTableCell";
    NSString *headerText;

    @interface HomePage ()

    @end

    @implementation HomePage
    @synthesize ActiveChal,PendingChal;

    -(IBAction)makeChallenge:(id)sender{
        PickSport *second = [[PickSport alloc] initWithNibName:@"PickSport" bundle:nil];
        [self presentViewController:second animated:YES completion:nil];
    }

    - (void)viewDidLoad {
        [super viewDidLoad];

        // Arrays for filling table cells
        _HomeImages=@[@"ic_bengals_nfl",@"ic_bengals_nfl",@"ic_bengals_nfl",@"ic_bengals_nfl", ];
        _AwayImages=@[@"ic_bears_nfl",@"ic_bears_nfl",@"ic_bears_nfl",@"ic_bears_nfl", ];
        _SportGameInfo=@[@"7:00pm",@"8:00pm",@"9:00pm",@"10:00pm",];
        [self.PendingChal registerClass:[GameTableCell class] forCellReuseIdentifier:CellIdentifier];
        [self.ActiveChal registerClass:[GameTableCell class] forCellReuseIdentifier:CellIdentifier];


    }

    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }


    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    //Set up the table props
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }

    //number of rows in the table
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

        // rows eqiv to length of array SportGameinfo
        return _SportGameInfo.count;
    }


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

        //GameTableCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }

       if(tableView == PendingChal){
               NSLog(@"in Pend table");
       int row =[indexPath row];
           cell.HomeImage.image=[UIImage imageNamed:[_HomeImages objectAtIndex:indexPath.row]]; //thumbnails objectAtIndex:indexPath.row]
            cell.AwayImage.image=[UIImage imageNamed:[_AwayImages objectAtIndex:indexPath.row]];
            cell.GameTime.text=[_SportGameInfo objectAtIndex:indexPath.row];
                                     }

       if(tableView == ActiveChal){
            NSLog(@"in Active table");
            int row =[indexPath row];
            cell.GameTime.text=_SportGameInfo[row];
            cell.HomeImage.image=[UIImage imageNamed:_HomeImages[row]];
            cell.AwayImage.image=[UIImage imageNamed:_AwayImages[row]];
            }
        return cell;
    }


    -(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        // 1. The view for the header
        UIView* headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 22)];
        if(tableView == PendingChal){
            headerText= @"Pending Challenges (waiting on you)";
        }
        else {
            headerText= @"Active Challenges";
                }
        // 2. Set a custom background color and a border
        headerView.backgroundColor = [UIColor colorWithWhite:0.5f alpha:1.0f];
        headerView.layer.borderColor = [UIColor colorWithWhite:0.5 alpha:1.0f].CGColor;
        headerView.layer.borderWidth = 0;

        // 3. Add a label
        UILabel* headerLabel = [[UILabel alloc] init];
        headerLabel.frame = CGRectMake(0, 0, tableView.frame.size.width -0, 20);
        headerLabel.backgroundColor = [UIColor blackColor];
        headerLabel.textColor = [UIColor whiteColor];
        headerLabel.font = [UIFont boldSystemFontOfSize:16.0];
        headerLabel.text = headerText;
        headerLabel.textAlignment = NSTextAlignmentLeft;
        // 4. Add the label to the header view
        [headerView addSubview:headerLabel];
        // 5. Finally return
        return headerView;
    }


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"didSelectRowAtIndexPath");
        /*UIAlertView *messageAlert = [[UIAlertView alloc]
         initWithTitle:@"Row Selected" message:@"You've selected a row" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];*/

        UIAlertView *messageAlert = [[UIAlertView alloc]
                                     initWithTitle:@"Row Selected" message:[_SportGameInfo objectAtIndex:indexPath.row] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

        // Display the Hello World Message
        [messageAlert show];

    }

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"willSelectRowAtIndexPath");
        return indexPath;
    }


    @end

HomePage.h:

#import <UIKit/UIKit.h>

@interface HomePage : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *PendingChal;
@property (strong, nonatomic) IBOutlet UITableView *ActiveChal;
@property (nonatomic, strong)NSArray *HomeImages;
@property (nonatomic, strong)NSArray *AwayImages;
@property (nonatomic, strong)NSArray *SportGameInfo;

@end

And to be complete here are the connection of my HomePage.xib

connected xib

1

There are 1 answers

4
dopcn On BEST ANSWER

Put aside your app's weird behavior I notice you are not rendering the table cell in the usual way. So first try to render it in usual way as this :

  1. register nib in viewDidLoad because you create your cell in xib

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // Arrays for filling table cells
        _HomeImages=@[@"ic_bengals_nfl",@"ic_bengals_nfl",@"ic_bengals_nfl",@"ic_bengals_nfl", ];
        _AwayImages=@[@"ic_bears_nfl",@"ic_bears_nfl",@"ic_bears_nfl",@"ic_bears_nfl", ];
        _SportGameInfo=@[@"7:00pm",@"8:00pm",@"9:00pm",@"10:00pm",];
        [self.PendingChal registerNib:[GameTableCell nib] forCellReuseIdentifier:CellIdentifier];
        [self.ActiveChal registerNib:[GameTableCell nib] forCellReuseIdentifier:CellIdentifier];
    }
    
  2. dequeue reusable cell in - tableView:cellForRowAtIndexPath: and return it

  3. you don't need load nib in tableViewCell's init method remove

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"GameTableCell" owner:self options:nil]; self = [topLevelObjects objectAtIndex:0];