Subclassing UITableViewCell with its own Nib
interface-builder, ios, uitableview
Solution
In order to use the nib/xib file, you're going to have to instantiate the `FavouriteCell` differently.
Try this:
- Make sure you've changed the type of your `UITableViewCell` to be a subclass of `FavouriteCell` instead of the default `UITableViewCell` in your xib. Do this by:
- Clicking on the cell in the objects pane of Interface Builder.
- Then, go to the Identity Inspector tab and make sure the Class selection under Custom Class lists `FavouriteCell`.
- Change the `File's Owner` property to be the `UIViewController` where you want to display your custom `UITableViewCell` (pretty much same process as step #1).
- Add an `IBOutlet` property of type `FavouriteCell` to your `UIViewController`. Name it whatever you like (I'm going to call it `cell`).
- Back in the xib of the `UITableViewCell`, connect the IBOutlet for the `cell` property in File's Owner to your custom `UITableViewCell`.
- Use this code to load the cell programmatically:
- (FavouriteCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellId = @"FavCellId";
FavouriteCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];
if (!cell) {
// Loads the xib into [self cell]
[[NSBundle mainBundle] loadNibNamed:@"FavouriteCellNibName"
owner:self
options:nil];
// Assigns [self cell] to the local variable
cell = [self cell];
// Clears [self cell] for future use/reuse
[self setCell:nil];
}
// At this point, you're sure to have a FavouriteCell object
// Do your setup, such as...
[cell setRequestURL:[NSURL URLWithString:
[NSString stringWithFormat:@"%@?%@=%i",
URL_GET_POST_STATUS,
URL_PARAM_SERIAL,
[[self.favourites objectAtIndex:indexPath.row] intValue]]
];
return cell;
}
Problem
I'd like to create a custom UITableViewCell subclass that loads content asynchronously using a URL connection. I've got a UITableViewCell subclass that handles all of this and a Nib file that defines the layout of the cell, but I'm having trouble linking the two. Here's the code I'm using in `tableView:cellForRowAtIndexPath`: ``` static NSString *FavCellIdentifier = @"FavCellIdentifier"; FavouriteCell *cell = [tableView dequeueReusableCellWithIdentifier:FavCellIdentifier]; if (cell == nil) { cell = [[[FavouriteCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:FavCellIdentifier] autorelease]; } cell.requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@=%i", URL_GET_POST_STATUS, URL_PARAM_SERIAL, [[self.favourites objectAtIndex:indexPath.row] intValue]]]; return cell; ``` This gives a request URL to the UITableViewCell subclass, which handles loading in the `setRequestURL` method. In the FavouriteCell class I've kept the `initWithStyle:reuseIdentifier:` method as is, and in the Nib I've set FavCellIdentifier as the identifier, and FavouriteCell as the class. Now how do I make the FavouriteCell class load the Nib?