user3211165 user3211165 - 1 month ago 6
iOS Question

Button won't show up in the table cell

I have a UIButton subclass which customizes a button. Then I have a UITableViewCell subclass which uses this button and position it in the cell. Finally I have a subclass of UITableViewController which displays the table view and contains the customized cell. My problem is that the customized button "starbtn" won't show up in the table, while everything else is working properly. What is wrong in my code?

favButton.h

#import <UIKit/UIKit.h>

@interface favButton : UIButton {
BOOL _checked;
}

@property (nonatomic, setter = setChecked:) BOOL checked;

-(void) setChecked:(BOOL) check;

@end


favButton.m

#import "favButton.h"

@implementation favButton

@synthesize checked = _checked;

-(id) init
{
if( self=[super init] )
{
self.checked = NO;
[self addTarget:self action:@selector(OnCheck:) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}

-(void) awakeFromNib
{
self.checked = NO;
[self addTarget:self action:@selector(OnCheck:) forControlEvents:UIControlEventTouchUpInside];
}

-(void) setChecked:(BOOL) check
{
_checked = check;
if( _checked )
{
[self setTintColor:[UIColor clearColor]];
UIImage* img = [UIImage imageNamed:@"startbefore.jpg"];
[self setImage:img forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected|UIControlStateDisabled];

}
else
{
[self setTintColor:[UIColor clearColor]];
UIImage* img = [UIImage imageNamed:@"startafter.jpg"];
[self setImage:img forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected|UIControlStateDisabled];

}
}

-(void) OnCheck:(id) sender
{
self.checked = !_checked;
}


@end


imageCellCell.h

#import <UIKit/UIKit.h>
#import "favButton.h"

@interface imageCellCell : UITableViewCell

@property (nonatomic, strong) UIView *view;
@property (nonatomic, strong) UILabel *label1;
@property (nonatomic, strong) UILabel *label2;
@property (nonatomic, strong) UIImageView *prodimage;
@property (nonatomic, strong) UIImageView *thumbsup;
@property (nonatomic, strong) UILabel *label3;
@property (nonatomic, strong) UIImageView *basket;
@property (nonatomic, strong) UIButton *homebtn;

@property (nonatomic, strong) favButton *starbtn;

@end


imageCellCell.m

#import "imageCellCell.h"




@implementation imageCellCell

@synthesize view;
@synthesize label1;
@synthesize label2;
@synthesize prodimage;
@synthesize thumbsup;
@synthesize label3;
@synthesize basket;
@synthesize homebtn;
@synthesize starbtn;



- (instancetype)init {

self = [super init];
self.starbtn = [[favButton alloc]initWithFrame:CGRectMake(243,0, 30, 30)];

[starbtn setTintColor:[UIColor clearColor]];

[starbtn setBackgroundImage:[UIImage imageNamed:@"startbefore.jpg"]
forState:UIControlStateNormal];
return self;
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {

view = [[UIView alloc] initWithFrame:self.frame];
[self addSubview:view];

// initiate image
prodimage = [[UIImageView alloc]initWithFrame:CGRectMake(30,2, 180, 180)];

// initiate label1 score value
label1 = [[UILabel alloc] initWithFrame:CGRectMake(230,80,150,20)];
label1.textColor = [UIColor greenColor];

[[self label1] setFont:[UIFont systemFontOfSize:25]];


// initiate label2 score label
label2 = [[UILabel alloc] initWithFrame:CGRectMake(232,50,150,20)];

// initiate image
thumbsup = [[UIImageView alloc]initWithFrame:CGRectMake(240,108, 30, 30)];

// initiate label3 manufacturer

label3 = [[UILabel alloc] initWithFrame:CGRectMake(90,200,180,20)];

// initiate image
basket = [[UIImageView alloc]initWithFrame:CGRectMake(280,1, 30, 30)];


// initiate home button
homebtn = [[UIButton alloc]initWithFrame:CGRectMake(4,0, 30, 30)];


[homebtn setTintColor:[UIColor clearColor]];
[homebtn setBackgroundImage:[UIImage imageNamed:@"home.jpg"]
forState:UIControlStateNormal];


[view addSubview:prodimage];
[view addSubview:label1];
[view addSubview:label2];
[view addSubview:thumbsup];
[view addSubview:label3];
[view addSubview:basket];
[view addSubview:homebtn];
[view addSubview:starbtn];

}
return self;
}

@end


ProdViewController.m

#import "ProdViewController.h"
#import "imageCellCell.h"


@interface ProdViewController ()

@end

@implementation ProdViewController
@synthesize tableview;
@synthesize tabbar;
@synthesize addfav;
@synthesize favData;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

favData = [[NSMutableArray alloc] init];
[tableview setDataSource:self];
[tableview setDelegate:self];


}

- (void)viewDidUnload
{
[self setTableview:nil];
[self setTabbar:nil];
[self setAddfav:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}


...


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


NSString *CellIdentifier;
NSString *CellIdentifierimg;

UITableViewCell *cell;
if (cell == nil) {
if (indexPath.row == 0) {
cell = [[imageCellCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierimg];
} else if (indexPath.row == 1) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}else if (indexPath.row == 2) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}else if (indexPath.row == 3) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}else if (indexPath.row == 4) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

}
}




switch ([indexPath row])
{
case 0:
{

imageCellCell *firstRowCell = (imageCellCell *)cell;


[firstRowCell.thumbsup setImage: [UIImage imageNamed:@"thumbs-up-green.jpg"]];

[firstRowCell.prodimage setImage: [UIImage imageNamed:@"test1.jpg"]];
[firstRowCell.label1 setText:@"10"];
[firstRowCell.label2 setText:@"Score"];
[firstRowCell.label3 setText:@"Name"];

[firstRowCell.basket setImage: [UIImage imageNamed:@"Basket.jpg"]];

// reference of the home button to the buttonclick method

[firstRowCell.homebtn addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];

// reference of the favorites button to the buttonclick method

[firstRowCell.starbtn addTarget:self action:@selector(clickFavButton:) forControlEvents:UIControlEventTouchUpInside];




firstRowCell.accessoryType = UITableViewCellAccessoryNone;

cell.selectionStyle = UITableViewCellSelectionStyleNone;


break;


}
case 1:
{


cell.textLabel.text = @"Row 2";
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.selectionStyle = UITableViewCellSelectionStyleNone;

break;

}

case 2:
{
cell.textLabel.text = @"Row 3";
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.selectionStyle = UITableViewCellSelectionStyleNone;


break;

}

case 3:
{
cell.textLabel.text = @"Row 4";
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.selectionStyle = UITableViewCellSelectionStyleNone;


break;


}

}

return cell;

}



-(IBAction)clickFavButton:(id)sender{

[favData addObject:@"productname"];



}



@end

Answer

why u are adding the starbtn in init method, put that code in - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

comment out entire init method

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
 {
     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
     if (self) {

    view = [[UIView alloc] initWithFrame:self.frame];
    [self addSubview:view];

    // initiate image
    prodimage = [[UIImageView alloc]initWithFrame:CGRectMake(30,2, 180, 180)];

    // initiate label1 score value
    label1 = [[UILabel alloc] initWithFrame:CGRectMake(230,80,150,20)];
    label1.textColor = [UIColor greenColor];

    [[self label1] setFont:[UIFont systemFontOfSize:25]];


    // initiate label2 score label
    label2 = [[UILabel alloc] initWithFrame:CGRectMake(232,50,150,20)];

    // initiate image
    thumbsup = [[UIImageView alloc]initWithFrame:CGRectMake(240,108, 30, 30)];

    // initiate label3 manufacturer

    label3 = [[UILabel alloc] initWithFrame:CGRectMake(90,200,180,20)];

    // initiate image
    basket = [[UIImageView alloc]initWithFrame:CGRectMake(280,1, 30, 30)];


    // initiate home button       
    homebtn = [[UIButton alloc]initWithFrame:CGRectMake(4,0, 30, 30)];


    [homebtn setTintColor:[UIColor clearColor]]; 
    [homebtn setBackgroundImage:[UIImage imageNamed:@"home.jpg"]
                        forState:UIControlStateNormal];

     //initilise hear
     //edit
     starbtn = [[favButton alloc]init];
     starbtn.frame = CGRectMake(243,0, 30, 30)];
    //edit
     [starbtn setTintColor:[UIColor clearColor]]; 

     [starbtn setBackgroundImage:[UIImage imageNamed:@"startbefore.jpg"] 
                   forState:UIControlStateNormal];

    [view addSubview: starbtn]; //add this

    [view addSubview:prodimage];
    [view addSubview:label1];
    [view addSubview:label2];
    [view addSubview:thumbsup];
    [view addSubview:label3];
    [view addSubview:basket];
    [view addSubview:homebtn];
    [view addSubview:starbtn];

 }
  return self;
}

Edited Answer

in your "favButton.h" file

  #import <UIKit/UIKit.h>
  @interface favButton : UIButton
  {
     BOOL    _checked;
  }
  @property (nonatomic, setter = setChecked:) BOOL checked;
  -(void) setChecked:(BOOL) check;

  @end

in "favButton.m" file

 #import "favButton.h"

 @implementation favButton

 - (id)initWithFrame:(CGRect)frame
  {
     self = [super initWithFrame:frame];
     if (self) {
          // Initialization code
          self.checked = NO;
          [self addTarget:self action:@selector(OnCheck:) forControlEvents:UIControlEventTouchUpInside];
      }
      return self;
   }

   -(void) awakeFromNib
    {
       self.checked = NO;
       [self addTarget:self action:@selector(OnCheck:) forControlEvents:UIControlEventTouchUpInside];
    }

   -(void) setChecked:(BOOL) check
   {
     _checked = check;
     if( _checked )
     {
      //  [self setTintColor:[UIColor clearColor]];
          UIImage* img = [UIImage imageNamed:@"22.jpg"];
      //        [self setImage:img forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected|UIControlStateDisabled];
        [self setImage:[UIImage imageNamed:@"22.jpg"] forState:UIControlStateNormal];

      }
      else
      {
       // [self setTintColor:[UIColor clearColor]];
        UIImage* img = [UIImage imageNamed:@"33.jpg"];
       // [self setImage:img forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected|UIControlStateDisabled];
       [self setImage:[UIImage imageNamed:@"33.jpg"] forState:UIControlStateNormal];
     }
   }

  -(void) OnCheck:(id) sender
  {
     self.checked = !_checked;
  } 


 /*
 // Only override drawRect: if you perform custom drawing.
  // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
  {
    // Drawing code
  }
 */

 @end

in imageCellCell.h file

include only these methods

  - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
 {
    // Initialization code
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        view = [[UIView alloc] initWithFrame:self.frame];
        [self addSubview:view];

        // initiate image
        prodimage = [[UIImageView alloc]initWithFrame:CGRectMake(30,2, 180, 180)];

        // initiate label1 score value
        label1 = [[UILabel alloc] initWithFrame:CGRectMake(230,80,150,20)];
        label1.textColor = [UIColor greenColor];

        [[self label1] setFont:[UIFont systemFontOfSize:25]];


        // initiate label2 score label
        label2 = [[UILabel alloc] initWithFrame:CGRectMake(232,50,150,20)];

        // initiate image
        thumbsup = [[UIImageView alloc]initWithFrame:CGRectMake(240,108, 30, 30)];

        // initiate label3 manufacturer

        label3 = [[UILabel alloc] initWithFrame:CGRectMake(90,200,180,20)];

        // initiate image
        basket = [[UIImageView alloc]initWithFrame:CGRectMake(280,1, 30, 30)];


        // initiate home button
        homebtn = [[UIButton alloc]initWithFrame:CGRectMake(4,0, 30, 30)];


        [homebtn setTintColor:[UIColor clearColor]];
        [homebtn setBackgroundImage:[UIImage imageNamed:@"home.jpg"]
                           forState:UIControlStateNormal];
        starbtn = [[favButton alloc]initWithFrame:CGRectMake(243,0, 30, 30)];
        starbtn.backgroundColor = [UIColor greenColor];
       // starbtn.frame = CGRectMake(243,0, 30, 30);

        //edit
        [starbtn setTintColor:[UIColor clearColor]];

        [starbtn setBackgroundImage:[UIImage imageNamed:@"startbefore.jpg"]
                           forState:UIControlStateNormal];

        [view addSubview: starbtn]; //add this

        [view addSubview:prodimage];
        [view addSubview:label1];
        [view addSubview:label2];
        [view addSubview:thumbsup];
        [view addSubview:label3];
        [view addSubview:basket];
        [view addSubview:homebtn];
        [view addSubview:starbtn];

    }
    return self;
  }

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

     // Configure the view for the selected state
  }

  @end

in controller all are same no need to change

End Edit

Hope this helps u .. :)

Comments