How to use UINib to instantiate and use custom UITableViewCells

20,598

Solution 1

  1. Create your xib file with a UITableViewCell as the top-level object. This is called Cell.xib
  2. Create a UINib object based on this file
  3. Register the UINib with the table view (typically in viewDidLoad of your table view controller subclass).

Steps 2 and 3 can be combined, so you would use the following line in viewDidLoad:

[self.tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"];

Then, in cellForRowAtIndexPath, if you want one of the cells from the nib, you dequeue it:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

This either creates a new instance from the nib, or dequeues an existing cell.

Solution 2

@jrturtons answer is correct but unfortunately there's a bug in iOS 5 (fixed in iOS 6) in conjunction with VoiceOver: rdar://11549999. The following category on UITableView fixes the issue. Just use -fixedDequeueReusableCellWithIdentifier: instead of the normal dequeueReusableCellWithIdentifier:. Of course, the NIB must be registered using

[self.tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"];

before (in -viewDidLoad).

UITableView+Workaround.m:

@implementation UITableView (Workaround)
- (id)fixedDequeueReusableCellWithIdentifier:(NSString *)identifier {
    id cell = [self dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        // fix for rdar://11549999 (registerNib… fails on iOS 5 if VoiceOver is enabled)
        cell = [[[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil] objectAtIndex:0];
    }
    return cell;
}
@end
Share:
20,598
inforeqd
Author by

inforeqd

Updated on July 14, 2022

Comments

  • inforeqd
    inforeqd almost 2 years

    how would i use UINibs to instantiate and use a UITableViewCell for a tableview in iOS5.0. I know there is a registerNib:forCellReuseIdentifier: in iOS5.0 that also needs to be used, but am not sure how to use it

    Thanks in advance for any help on this

  • SimplyKiwi
    SimplyKiwi almost 12 years
    I actually just implemented the Cell Reuse Identifier myself and it works quite nicely!
  • Ortwin Gentz
    Ortwin Gentz over 11 years
    Your solution is absolutely correct but unfortunately there's a bug in iOS 5 (fixed in iOS 6) in conjunction with VoiceOver: openradar.appspot.com/11549999
  • Steven Fisher
    Steven Fisher over 11 years
    I've read about this bug a number of times, but have never experienced it — even on iOS 5.0 when running VoiceOver. I believe the actual issue to be far more complicated than this.
  • Satyam
    Satyam about 11 years
    On loading the cell, I want to customize the background color programmatically (because the bg color is a pattern image). Is it possible?
  • jrturton
    jrturton about 11 years
    @Satyamsvv Yes, use awakeFromNib in the cell subclass. If its more complicated than that, ask a new question.