Adding Subviews to the Cell's contentView
The cell's contents sit insie a UIView called contentView
subviews can be any control or component that inherits form UIView
itself include labels, controls , text field , images,
adding content into the custom view that will vary with each row
to reach back inside the cutom view, as it were to access the
properties in order to set them
think of your custom view in two pars
Creating the structure:Setting the size ad position of the elements
that you're going to add to the cell's contentView in each new cell
Updaing the content Configuring the properties of the custom elements you;ve added to the contentView as each row is updated
standard cell contents textLabel, detailTextLabel,imageView and accessorView
then they won't be inserted into the cell and won't get in the ay of your custom layout
views and their Hierarchy
how UIViews relate to each other
to where?and what?
each UIView can have a parent - or superView and one or may subViews
visibility of subViews is tied to their superView, so setting the visibility of UIView C to
each UIVIew has a property called subViews , which is an NSArray
for(UIView *theSubView in parentView.subViews) {}
each UIView has a superView property that is a reference to the parent view
keeping some diagrams sketched
Creaing the elements in the Cell
tableView:cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPah * )indexPath {
static NSString *cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyeDefault reuseIdentifier:cellIdentifier];
UILabel *myLabel = [[UILabel alloc]init];
myLabel.frame = CGRectMake(75,10,200,25);
myLabel.tag = 1020;
[cell.contentView addSubview:myLabel];
CGRect myImageFrame = CGRectMake(10,10,50,25);
UIImageView *myImageView = [[UIImageView alloc]initWithFrame:myImageFrame];
myImageView.tag = 1010;
[cell.contentView addSubview:myImageView];
}
return cell;
}
Updating the Content
a bit of stumbling block.
after the subviews that you created are inserted into the cell's contentView,
you can no longer access them directly to update them, they're effectively subsumed
into the cell's contentView which doesn't have any properties or outlets you can use to update then
this is where the tags come in,
Getting a reference to the custom label and imageView inside the cell's contentView
which you do by referencing their tags
Updating the content of the controls
Tagging Controls in the Cell
every UIView control has an associate tag property,
caveat
in the View section of the Attirbutes inspector
in code [myControl setTag:1050]
start the numbering at a large value, and leave space in the numbering for additional tags , starting tag numbering at 100, and incrementing by 10 for each tag.
Keep the tag numbering consistent with the layout of the NIB.
keeping track of tag in your classes. This is where enumerations com into their
into their own
compile-time global find- and - replace
enum{
kCustomCellTitleLabel = 1000
}
UILabel *myLabel = (UILabel *)[nib viewWithTag:kCustomCellTitleLabel];
starting an enum with k just indicates it's a constant.
Casting controls
the viewWithTag method returns a UIView,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
statis NSString *cellIdentifier = @"cellIdentifier";
satic const int kLabel = 1010;
static const int kImage = 1020;
UITableViewCell *cell = [tableView dequeueReseableCellWithIdentifier:cellIdentifier];
if(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
CGRect myImageFrame = CGRectMake(10,10,50,25);
UIIMageView *myImageView = [[UIImageView alloc] initWithFrame:myImageFrame];
myImageView.tag = kLable;
[cell.contentView addSubView:myImageView];
UILabel *myLabel = [[UILabel alloc] init];
myLabel.frame = CGRectMake(75,10,200,25);
myLabel.tag = kImage;
[cell.contentView addSubview:myLabel];
}
UIImageView *myImageView = (UIImageView *)[cell viewWithTag:kLabel];
[myImageView setImage:[UIImage imageNamed:@"cellimage.png"]];
UILabel *myLabel - (UILabel *)[cell viewWithTag:kImage];
myLabel.text = [tableData objectAtIndex:indexPath.row];
return cell;
}
Creating Custom Cells Visually Using Interface Builder
good at mentally translating between the cell's layout and the coordinates
in the code , that code can be difficult to follow
An altrnative approach is to use the power and flexibility of Interface Builder to create a custom cell ina a NIB file,
and use this to create a completely customized cell whenever a new one is required.
The Stages of Creating Cells Visually
Creating custom cells visually with Interface Builder is a multistage process;
Create a new NIB file, and lay out the cell using Intervace Bilder
Ensure the both the NIB and the tableView's dataSource are usig the same cell identifier.
Creating controls inside your new cell.
Assign tags to the controls so they can be accessed form the outside world.
Creating a New NIB file
Command + N
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{
return 100;
}
Setting Up the Cell's Identifier
reuseIdentifier
UINib *theNib = [UINib nibWithNibName:@"NewCell" bundle:nil];
cell = [[theNib instantiateWithOwner:self options:nil] objectAtIndex:0];
UILabel *myLabel = (UILabel *)[cell viewWithTag:1050];
myLabel.text=@"Some custom text";