UITableView with two custom cells (multiple identifiers)
* I've renamed some of your NIB/Class names for a better understanding. *
First, you should register each cells' NIB:
- (void)viewDidLoad{ [super viewDidLoad]; static NSString *CellIdentifier1 = @"ContentCell"; static NSString *CellIdentifier2 = @"SpaceCell"; UINib *nib = [UINib nibWithNibName:@"CellViewNIBName" bundle:nil]; [self.tableView registerNib:nib forCellReuseIdentifier:CellIdentifier1]; nib = [UINib nibWithNibName:@"CellSpaceNIBName" bundle:nil]; [self.tableView registerNib:nib forCellReuseIdentifier:CellIdentifier2]; self.contentView.hidden = YES; [self loadData];}
Because you have the NIBs registered, dequeueReusableCellWithIdentifier:
will always return a cell:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier1 = @"ContentCell"; static NSString *CellIdentifier2 = @"SpaceCell"; // Space Cell if (indexPath.row % 2 == 1) { CellSpace *cell = (CellSpace *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; return cell; } // Content cell else { CellView *cell = (CellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; // Configure cell return cell; }}
Last, but not least, make sure to implement the following delegate method:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ // Space cell's height if (indexPath.row % 2 == 1) { return 20.0f; } // Content cell's height else { return 80.0f; }}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *returncell; static NSString *cellIdentifier ; if(indexPath.section == 0) { cellIdentifier = @"cell1"; } else if (indexPath.section == 1) { cellIdentifier = @"cell2"; } UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; MapTableViewCell *myCustomCell = (MapTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if(indexPath.section == 0) { if(myCell == nil) { myCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; getLocationBtn = [UIButton buttonWithType:UIButtonTypeCustom]; getLocationBtn.frame = CGRectMake(myCell.frame.origin.x,myCell.frame.origin.y+5 , 200, 30); [getLocationBtn setTitle:@"your button title" forState:UIControlStateNormal]; [getLocationBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal]; [getLocationBtn addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; } [myCell.contentView addSubview:getLocationBtn]; returncell = myCell; } else if (indexPath.section == 1) { if (myCustomCell == nil) { myCustomCell = [[MapTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } myCustomCell.nearbyLocation.text = @"demo Text"; returncell = myCustomCell; } return returncell;}
//mycustom tablviewcell
import "MapTableViewCell.h"
@implementation MapTableViewCell@synthesize nearbyLocation;-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self) { self.backgroundColor = [UIColor groupTableViewBackgroundColor]; nearbyLocation = [[UILabel alloc]initWithFrame:CGRectMake(10, 5, 200, 30)]; [self addSubview:nearbyLocation]; } return self;}@end
Best way to use number of custom cells with default cell
In addition for the answers provided, I want to emphasize on the Cell Identifier for each different custom cells must be different too.
For example custom cellA
with identifier "Cell"
and custom cellB
with identifier "Cell2"
.