Reputation: 235
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
Upvotes: 0
Views: 67
Reputation: 8402
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 .. :)
Upvotes: 1