Custom TableViewCell With Image Disappearing When Selected - ios

I have created a custom tableviewcell class and the cells load perfectly, however, when I click on them they disappear and come back when I click on a different cell. Can anyone help me understand why? Thanks in advance!
#import "CustomTableViewCell.h"
#implementation CustomTableViewCell
UIView *backgroundView;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 65)];
UIView *visibleBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(29, 0, backgroundView.bounds.size.width -58, backgroundView.bounds.size.height)];
[visibleBackgroundView setBackgroundColor:[[UIColor alloc] initWithPatternImage:[UIImage imageNamed:#"tableViewCell.png"]]];
[backgroundView addSubview:visibleBackgroundView];
self.backgroundView = backgroundView;
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
UIView *selectedBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 65)];
UIView *visibleSelectedBackground = [[UIView alloc] initWithFrame:CGRectMake(29, 0, backgroundView.bounds.size.width -58, backgroundView.bounds.size.height)];
[visibleSelectedBackground setBackgroundColor:[[UIColor alloc] initWithPatternImage:[UIImage imageNamed:#"selectedTableViewCell#2x.png"]]];
[selectedBackgroundView addSubview:visibleSelectedBackground];
self.selectedBackgroundView = selectedBackgroundView;
}
}
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
[self setHighlighted:NO];
}
}

I was able to fix it with the following solution
#import "CustomTableViewCell.h"
#implementation CustomTableViewCell{
UIView *backgroundView;
UIView *visibleBackgroundView;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 65)];
visibleBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(29, 0, backgroundView.bounds.size.width -58, backgroundView.bounds.size.height)];
[visibleBackgroundView setBackgroundColor:[[UIColor alloc] initWithPatternImage:[UIImage imageNamed:#"tableViewCell.png"]]];
[backgroundView addSubview:visibleBackgroundView];
self.backgroundView = backgroundView;
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
}
}
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
[visibleBackgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:#"selectedTableViewCell.png"]]];
} else{
[visibleBackgroundView setBackgroundColor:[[UIColor alloc] initWithPatternImage:[UIImage imageNamed:#"tableViewCell.png"]]];
}
}

Related

Add a button on the custom UITableViewHeaderFooterView

I am trying to add a button programmatically on the custom UITableViewHeaderFooterView class as follows, it does not appear.
I wonder what I am missing or doing wrong ?
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
UIButton * clickBtn = [[UIButton alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-50, 0, 50, 50)];
clickBtn.imageView.image = [UIImage imageNamed:#"carat-open.png"];
[self.contentView addSubview:clickBtn];
}
return self;
}
Create UIButton inside of this function and add button as a subview to header view
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIButton * clickBtn = [[UIButton alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-50, 0, 50, 50)];
clickBtn.imageView.image = [UIImage imageNamed:#"carat-open.png"];
UIView *headerView = [[UIView alloc] init];
[headerView addSubview:clickBtn];
headerView.backgroundColor=[UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1.0];
return headerView;
}
To add custom view in Section Footer:
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 20;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [self getViewForFooterForSection];
}
- (UIView*)getViewForFooterForSection
{
UIView *sectionFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
sectionFooterView.backgroundColor = [UIColor redColor];
return sectionFooterView;
}
To add custom view for section footer from custom view file
CustomFooter
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
self.frame = frame;
self.backgroundColor = [UIColor blueColor];
}
return self;
}
View Controller
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [self getViewForFooterForSection];
}
- (UIView*)getViewForFooterForSection
{
CustomFooter *sectionFooterView = [[CustomFooter alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
return sectionFooterView;
}
To add custom view in Table footer View
tbl.tableFooterView = [self getViewForTableView];
- (UIView*)getViewForTableView
{
UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
tableFooterView.backgroundColor = [UIColor greenColor];
return tableFooterView;
}
you can't set a button image like that .
clickBtn.imageView.image = [UIImage imageNamed:#"carat-open.png"];
imageView property is readonly.
use this one
(void)setImage:(nullable UIImage *)image forState:(UIControlState)state;

UI code works but change to XIB failed

the code below works
#interface MyUICollectionViewCell : UICollectionViewCell {
}
#implementation UICollectionViewCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self = [super initWithFrame:frame];
if (self) {
_moreView = [[UIView alloc] init];
_moreView.backgroundColor = [UIColor clearColor];
_moreView.frame = CGRectMake(self.frame.size.width - 70, 0, 45, 37);
[self addSubview:_moreView];
_moreView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapMoreView = [[UITapGestureRecognizer alloc]initWithTarget:self action:#selector(goToDoSomething)];
[_moreView addGestureRecognizer:tapMoreView];
}
return self;
}
return self;
}
- (void)doSomeThing
{
}
when I touch the subview (gray block), it will trigger the event,
but I change to XIB(the sub view links to IBOutlet mUIView), and change the code as below, goToDoSomething cannot be triggered.
Your comment welcome
#interface MyUICollectionViewCell : UICollectionViewCell {
IBOutlet UIView *mUIView;
}
#implementation UICollectionViewCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self = [super initWithFrame:frame];
if (self) {
NSArray *nibView = [[NSBundle mainBundle] loadNibNamed:#"MyUICollectionViewCell"owner:self options:nil];
UIView *bw = [nibView objectAtIndex:0] ;
bw.userInteractionEnabled = YES;
[self.contentView addSubview:bw];
mUIView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapMoreView = [[UITapGestureRecognizer alloc]initWithTarget:self action:#selector(goToDoSomething)];
[mUIView addGestureRecognizer:tapMoreView];
}
return self;
}
return self;
}
- (void)doSomeThing
{
}

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
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 .. :)

UITableViewCell subclass

I have this code segment:
if (cell == nil)
{
CGRect cellFrame = CGRectMake(0,0,300,250);
cell = [[UITableViewCell alloc] initWithFrame:cellFrame
reuseIdentifier:CellTableIndetifier];
CGRect nameLabelRect = CGRectMake(0, 5, 70, 20);
UILabel* nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];
nameLabel.textAlignment = NSTextAlignmentCenter;
nameLabel.text = #"Name";
nameLabel.font = [UIFont boldSystemFontOfSize:12];
[cell.contentView addSubview: nameLabel];
CGRect colorLabelRect = CGRectMake(0, 25, 70, 20);
UILabel* colorLabel = [[UILabel alloc] initWithFrame:colorLabelRect];
colorLabel.textAlignment = NSTextAlignmentCenter;
colorLabel.text = #"Color";
colorLabel.font = [UIFont boldSystemFontOfSize:12];
[cell.contentView addSubview: colorLabel];
CGRect priceLabelRect = CGRectMake(0, 45, 70, 20);
UILabel *priceLabel = [[UILabel alloc] initWithFrame:priceLabelRect];
priceLabel.text = #"Price";
priceLabel.textAlignment = NSTextAlignmentCenter;
colorLabel.font = [UIFont boldSystemFontOfSize:12];
[cell.contentView addSubview:priceLabel];
CGRect nameValueRect = CGRectMake(80, 5, 200, 20);
UILabel* nameValue = [[UILabel alloc] initWithFrame: nameValueRect];
nameValue.tag = kNameValueTag;
[cell.contentView addSubview:nameValue];
CGRect colorValueRect = CGRectMake(80, 25, 200, 20);
UILabel* colorValue = [[UILabel alloc] initWithFrame:colorValueRect];
colorValue.tag = kColorValueTag;
[cell.contentView addSubview:colorValue];
CGRect priceValueRect = CGRectMake(80, 45, 200, 20);
UILabel *priceValue = [[UILabel alloc] initWithFrame:priceValueRect];
priceValue.tag = kPriceValueTag;
[cell.contentView addSubview:priceValue];
}
and I would like to make that make that into a subclass, so I don't have to write all those lines, I just say cell = CustomCell and it does everything in the subclass.
Here is the basic code for a subclass of UITableCellView :
#import <UIKit/UIKit.h>
#interface CustomCell : UITableViewCell
{
}
#end
-----------------------------------------------------------
#import "CustomCell.h"
#implementation CustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
-(void)layoutSubviews{
[super layoutSubviews];
}
/*
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}*/
#end
It is auto-generated if you create a new file of type Objective-C Class and specify UITableViewCell in filed subclass of
Following is what I usually do. If you use the cell only in 1 view controller, you can just put it in the same file as the view controller.
#interface MyCell : UITableViewCell
#property (strong, nonatomic) UILabel* nameValue;
#property (strong, nonatomic) UILabel* colorValue;
#property (strong, nonatomic) UILabel* priceValue;
#end
#implementation MyCell
-(id)init {
self = [super initWithStyle:whatever_style];
// Create & position UI elements
UILabel* nameLabel = [[UILabel alloc] init];
nameLabel.frame = .... // frame, font, etc
[self.contentView addSubview:nameLabel]
self.nameValue = [[UILabel alloc] init];
self.nameValue = .... // frame, font, etc
[self.contentView addSubview:self.nameValue];
// Do the same thing for color, price
return self;
}
#end
By exposing nameValue, colorValue, priceValue, I allow them to be changed from outside (ie the UITableViewController). I didn't expose other labels because they are static. Unless you need special positioning, you don't have to override layoutSubviews. autoresizingMask is sufficient in most cases.
There is two way I use to solve this.
The "quick and dirty" is to design a UITableViewCell into your UITableView with the stuff you need (UILabel, UIImageView,...) and set a unique tag for each element, then when you dequeue a UITableViewCell you can reuse the elements in like this :
UILabel *nameLabel = (UILabel*)[cell viewWithTag:NAME_LABEL_TAG];
if(!nameLabel) {
// If the label does not exist, create it
CGRect nameLabelRect = CGRectMake(0, 5, 70, 20);
nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect];
nameLabel.textAlignment = NSTextAlignmentCenter;
nameLabel.text = #"Name";
nameLabel.font = [UIFont boldSystemFontOfSize:12];
[cell.contentView addSubview: nameLabel];
}
Or the (imo) best way is to create a custom UITableViewCell and subclass UItableviewCell, you have a good tutorial there : Custom UITableViewCell
I guess your are putting this stuff in your cellForRowAtIndexPath: delegate method and I can see why your strive to remove it from this place.
Create a new Objective-C class via New->File and put the subview related calls you posted in the layoutSubviews: method. In cellForRowAtIndexPath: in your table view delegate now use this class instead of the generic UITableViewCell. Don't forget to import your newly created file.
#import "CellVideo.h"
#implementation CellVideo
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(#"initWithCoder");
self = [super initWithCoder: aDecoder];
if (self)
{
// Initialization code
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] init];
[moviePlayer.view setFrame:CGRectMake(10, 75, 300, 260)];
[moviePlayer.view setBackgroundColor:[UIColor blackColor]];
[moviePlayer.view setTag:333];
[moviePlayer setControlStyle:MPMovieControlStyleNone];
moviePlayer.scalingMode = MPMovieScalingModeFill;
_movie=moviePlayer;
UIImageView *imagrViewThumb=[[UIImageView alloc]initWithFrame:CGRectMake(10, 75, 300, 260)];
[imagrViewThumb setBackgroundColor:[UIColor redColor]];
[imagrViewThumb setTag:333];
[self.contentView insertSubview:imagrViewThumb atIndex:0];
}
return self;
}
-(void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
///use it in this way
CellIdentifier=#"cellvideo";
UITableViewCell *cell=nil;
// CellVideo *cellVideo=nil;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

issue with using multiple cell types in uitableview

I am using this code for multiple cell types in a UITableView
The problem is that the cell text is invisible. The code for cellForRowAtIndexPath as well as the cell class code is given below:
code:
static NSString *kCellIdentifier = #"NewsViewControllerTableCell";
static NSString *kCellIdentifier2 = #"SubscribeCell";
if ((indexPath.row==0) && ([[NSUserDefaults standardUserDefaults] boolForKey:#"subscribeButtonOption"]))
{
SubscribeCell* cell = (SubscribeCell*)[tableView dequeueReusableCellWithIdentifier:kCellIdentifier2];
if (cell == nil) {
cell = [[[SubscribeCell alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 35.0) reuseIdentifier:kCellIdentifier2] autorelease];
cell.contentView.backgroundColor = kColorR53G53B53;
cell.subscribeLabel.font = kLucidaSansStdFontBold_14;
cell.subscribeLabel.textColor = [UIColor whiteColor];
}
cell.subscribeLabel.textColor=[UIColor redColor];
cell.subscribeLabel.text = #"+ SUBSCRIBE TO NEWSLETTER";
cell.selectedBackgroundView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
cell.selectedBackgroundView.backgroundColor =kColorR53G53B53;
[cell setNeedsDisplay];
return cell;
}
else
{
//another cell
}
=========
header:
#import <UIKit/UIKit.h>
#interface SubscribeCell : UITableViewCell{
UILabel *subscribeLabel;
}
#property(nonatomic, retain) UILabel *subscribeLabel;
#end
and implementation class:
#import "SubscribeCell.h"
#implementation SubscribeCell
#synthesize subscribeLabel;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
subscribeLabel=[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 323.0, 40.0)];
subscribeLabel.textColor=[UIColor whiteColor];
self.backgroundColor=kColorR53G53B53;
}
return self;
}
Check to see if subscribeLabel is nil. You're creating it in initWithNibName:bundle: but are initializing with initWithFrame:reuseIdentifier:, so it's not reaching your label creation code.
If I try to compile your code, I get an error message stating that UITableViewCell does not declare a method called 'initWithNibName: bundle:'. You should use the proper initialization method 'initWithStyle: reuseIdentifier:'. You also forget to add the subscribeLabel to the contentView of the cell.
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
subscribeLabel=[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 323.0, 40.0)];
subscribeLabel.textColor=[UIColor whiteColor];
[self.contentView addSubview:subscribeLabel];
self.backgroundColor=kColorR53G53B53;
}
return self;
}

Resources