Created
January 28, 2012 21:52
-
-
Save dhoerl/1695877 to your computer and use it in GitHub Desktop.
UITableViewCells from a NIB - better than Apple's iOS 5 code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Reloading the NIB is expensive. Better to load it once, then instantiate the objects when you need a cell. Note that you can add UIImageViews etc to the nib, even multiple cells, using this method (Apple's "registerNIB" iOS5 allows only one top level object - one UITableViewCell. Bug 10580062 "iOS5 tableView registerNib: overly restrictive" | |
So my code is below - you read in the NIB once (in +initialize like I did or in viewDidload - whatever. From then on, you instantiate the nib into objects then pick the one you need. This is much more efficient than loading the nib over and over. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#if ! __has_feature(objc_arc) | |
#error THIS CODE MUST BE COMPILED WITH ARC ENABLED! | |
#endif | |
static UINib *cellNib; | |
+ (void)initialize | |
{ | |
if(self == [ImageManager class]) { | |
cellNib = [UINib nibWithNibName:@"ImageManagerCell" bundle:nil]; | |
assert(cellNib); | |
} | |
} | |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
static NSString *cellID = @"TheCell"; | |
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; | |
if(cell == nil) { | |
NSArray *topLevelItems = [cellNib instantiateWithOwner:nil options:nil]; | |
NSUInteger idx = [topLevelItems indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) | |
{ | |
UITableViewCell *cell = (UITableViewCell *)obj; | |
return [cell isKindOfClass:[UITableViewCell class]] && [cell.reuseIdentifier isEqualToString:cellID]; | |
} ]; | |
assert(idx != NSNotFound); | |
cell = [topLevelItems objectAtIndex:idx]; | |
} | |
cell.textLabel.text = [NSString stringWithFormat:@"Howdie %d", indexPath.row]; | |
return cell; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment